%\documentclass[twoside]{article}
%\usepackage{epsfig,html,amsmath,amssymb,lscape,longtable,pstricks}
%\usepackage{graphics}
%\pagestyle{headings}
%\markboth{}{}
%\newcommand{\hytt}[1]{\texttt{\hyphenchar\font=\defaulthyphenchar #1}}

% !Mode:: "TeX:UTF-8"
\documentclass[twoside]{article}
\usepackage{epsfig,html,cite,hyperref}
\usepackage{graphics}
\usepackage{indentfirst}
\usepackage{multicol}

\usepackage{xeCJK} % seperate the english and chinese


\setCJKmainfont[ItalicFont={AR PL UKai CN}]{AR PL UMing CN} %设置中文默认字体
%\XeTeXlinebreaklocale "zh"  % Auto linebreak for chinese
\XeTeXlinebreakskip = 0pt plus 1pt minus 0.1pt % Auto linebreak for chinese
\setlength{\parindent}{2em}

\begin{document}
	
%\linebreak {4}

	%{\kaishu 楷体}
	%{\heiti 黑体}
	%{\fangsong 仿宋}
	
	\title{AutoPDMS Design and Implementation}
	\author{
	}
	\maketitle {}
	\begin{figure}[ht]
		\centering
		\epsfig{file=processplant.jpg,width=12cm}
	%	\caption{process plant 3D model\label{cover}}
	\end{figure}
	
\thispagestyle{empty}%目录页不显示页码

\newpage

	
%\begin{multicols}{2}
	
\section* {Main Developer Introduction}

\addcontentsline{toc}{section}{Main Developer Introduction}

The main developer Wu Guoren (1982-), male, was born in Anhua County, Hunan Province,China in June 1982. He graduated from Central South University of China in July 2004\htmlref{csu} {www.csu.edu.cn} with a bachelor's degree in Mechanical and Electrical Engineering. After graduation, he joined UESOFT Corp.\ref {uesofthistory}, and served as the leader of the 3D hanger and support design software. He and Xie Jixiang jointly developed the 3D hanger and support design software PHSModeler. In 2006, he served as the chief architect of the 3D plant design management system software, deputy project manager, presided over the design and implementation of the AutoPDMS system architecture and main code. In 2007, he left UESOFT Corp.

\section*{Preface}
\addcontentsline{toc}{section}{Foreword}
The new generation of 3D plant collaborative design management system AutoPDMS developed by UESOFT Corp. (UESOFT) provides a unified design environment for plant designers. AutoPDMS operates in a similar way to AVEVA PDMS, integrating design libraries (Piping, Equipment, HVAC, H\&S, Steel), component libraries and specification libraries (Paragon \& Specon), axonometric drawings (ie tube segments, air views) Isodraft Projection drawing (plan section view) DRAFT, stress analysis interface, fluid analysis interface, model conversion (export PDMS model to AutoPDMS), rights management Admin, multi-user collaborative design. AutoPDMS is a set of C++ libraries written in C++, boost, mfc, and objectarx.

Readers are welcome to feedback the questions in the book. Contact: uesoft@163.com.

\section*{作者简介}

\addcontentsline{toc}{section}{作者简介}

李国斌，男，1965年9月生于湖南省临澧县，1988年7月毕业于华中科技大学热能动力专业。同年加入湖南省电力勘测设计院从事火力发电厂工程设计工作，历任技术员、助理工程师、工程师、高级工程师。2000年创办长沙优易软件开发有限公司，从事软件开发项目管理和研发、经营管理工作。领导开发了三维工厂设计管理系统AutoPDMS、管道应力分析软件AutoPSA等软件。现从事三维数据CAD/CAE集成设计仿真平台AutoPDMS的研究开发与经营管理工作。

张书俊，男，1976年3月生于河南省内乡县，1999年7月毕业于国防科技大学空气动力学专业，2002年获工学硕士学位，2006年获工学博士学位。2006年加入长沙优易软件开发有限公司，从事应力分析软件开发工作，作为主要完成人参与管道应力分析软件AutoPSA7.0及后续版本的开发工作。现从事三维数据CAD/CAE集成设计仿真平台AutoPDMS的研究开发工作，主要研究方向为计算结构力学和流固耦合分析。

谢新明，男，1989年4月出生于江西省赣州市赣县，2015年6月本科毕业于中国地质大学(武汉)信息管理与信息系统专业， 2018年1月获长沙理工大学计算机技术专业硕士学位，现为长沙优易软件开发有限公司建筑结构设计软件项目组长。

董浩，男，1994年3月出生于湖南省沅江市，2016年6月毕业于湖南涉外经济学院电子信息工程专业，现为长沙优易软件开发有限公司程序员。

\setcounter{page}{1}%从下面开始编页码
\tableofcontents
\cleardoublepage

\newpage
\part{system architecture}

\section{System Overview}
This book introduces the design and implementation of AutoPDMS.
AutoPDMS is a set of C++ APIs written in Boost, ObjectARX, and MFC that can be used in CAD and CAE systems. Originally known as the 3D plant design management system, some users now use it to design 3D plants, such as for piping system design and stress analysis. It is currently being refactored into an integrated CAD/CAE design and simulation platform. It currently runs on Windows systems and requires AutoCAD support. In the future it may be refactored to support multiple operating systems such as linux, osx, android, etc., and may support more GUIs such as gtk or other graphics platforms such as osg, ogre, etc.

\subsection{history}
In 2006, UESOFT Corp. started the AutoPDMS software project of 3D factory design management system. In 2007, the first version of AutoPDMS7.0 was implemented, and users actively participated in testing the system. In 2008, AutoPDMS received the first commercial user. In 2012, UKSOFT was authorized to continue development of  AutoPDMS, and 2018 UESOFT Corp. decided to reconstruct AutoPDMS into CAD/CAE integrated design and simulation platform.

\subsection{System Structure}

The AutoPDMS system functions mainly include two parts of design and analysis, namely CAD and CAE.
The AutoPDMS system architecture includes persistence layers, domain objects and transaction operations, multi-user management, databases, display frameworks, display drivers, and input and output interface drivers.
This book includes the above. If this book does not completely solve your problem, please email us (uesoft@163.com).

he new generation of 3D plant collaborative design management system AutoPDMS developed by UESOFT Corp. (UESOFT) provides a unified design environment for plant designers. AutoPDMS operates in a similar way to AVEVA PDMS, integrating design libraries (Piping, Equipment, HVAC, H\&S, Steel), component libraries and specification libraries (Paragon \& Specon), axonometric drawings (ie tube segments, air views) Isodraft Projection drawing (plan section view) DRAFT, stress analysis interface, fluid analysis interface, model conversion (export PDMS model to AutoPDMS), rights management Admin, multi-user collaborative design. AutoPDMS is a set of C++ libraries written in C++, boost, mfc, and objectarx.

In order to facilitate secondary development, UESOFT announced to publish the full source code of AutoPDMS on the company website. This guide describes the steps for secondary development using the full source code of AutoPDMS.

\subsection{AutoPDMS system source code directory}
Below is the source code directory structure information of the AutoPDMS system listed by the author in the Windows command line of his laptop using the command dir /ons. For ease of understanding, a function comment is added after the directory name.
 
 驱动器 H 中的卷没有标签。
卷的序列号是 3CFE-80B2

H:/vc/AutoPDMS9.0 系统源代码目录

2018/07/09  19:42       DIR             .

2018/07/09  19:42       DIR             ..

2018/07/06  14:56       DIR             .git

2018/06/15  14:57       DIR             Admin			权限管理	

2018/06/15  14:57       DIR             APGlobalShare	全局库

2018/06/15  14:57       DIR             APLicensedCheck	许可证检查

2018/06/15  16:45       DIR             AutoBuild		编译批处理脚本程序

2018/06/15  14:57       DIR             CadReactor		cad反应器

2018/06/15  16:45       DIR             Catalogue		元件库

2018/06/15  16:45       DIR             CommonModule	公共模块

2018/06/15  16:46       DIR             config			配置

2018/06/15  14:57       DIR             DataBase		数据库

2018/06/15  16:45       DIR             Design			设计库

2018/07/09  19:39       DIR             Documents		文档，包含本文档

2018/06/15  16:45       DIR             Draft			二维图		

2018/06/15  16:45       DIR             DraftCommon		出图公用库

2018/06/15  16:45       DIR             FrameWork		框架

2018/06/15  14:57       DIR             Graphic			图形系统\label{graphicdisplay}

2018/06/15  16:45       DIR             GraphicOperation	图形化操作

2018/06/15  14:57       DIR             PDMSDataExportModule	AVEVA PDMS数据导出模块

2018/06/15  16:45       DIR             PDSoftToPDMS			PDSOFT导出到AutoPDMS

2018/06/15  14:57       DIR             Persist					持久层

2018/06/15  16:45       DIR             PlanDraft				平断面图

2018/06/15  16:45       DIR             Propcon					属性库

2018/06/15  16:45       DIR             RegisterCadCommand		注册cad命令

2018/06/15  16:45       DIR             Specification			等级库

2018/06/15  14:57       DIR             Spooler					管段图，轴测图

2018/06/15  14:57       DIR             StartMoudle				启动模块

2018/06/15  16:45       DIR             Table					表格 \label{tablesrc}

2018/06/15  16:45       DIR             UE-PSI1.1				AVEVA PDMS管道应力分析接口

2018/06/15  14:57       DIR             升级					  升级数据库字段

31 个目录 75,205,832,704 可用字节

\subsection{AutoPDMS software installation directory structure}
The following is the structure information of the AutoPDMS software system installation directory listed by the author using the command tree in the Windows command line after installing the AutoPDMS software on his laptop. For ease of understanding, functional comments are added after most directory names. I installed the AutoPDMS software in the directory H:/ Program Files (x86)/ 长沙优易软件开发有限公司 / AutoPDMS10.4.4.

文件夹 PATH 列表
卷序列号为 3CFE-80B2
H:.
├─add-in

├─AutoPDMS-2007-Win32	该目录存放AutoPDMS在AutoCAD2007-2009版本的Win32系统运行需要的动态库。

├─AutoPDMS-2007-Win64

├─AutoPDMS-2010-Win32

├─AutoPDMS-2010-Win64

├─AutoPDMS-2013-Win32

├─AutoPDMS-2013-Win64

├─AutoPDMS-2015-Win32

├─AutoPDMS-2015-Win64

├─AutoPDMS-Lic		AutoPDMS许可证管理动态库

├─Common Files		存放几个第三方动态库

├─Common Mdb		UESOFT系列软件AutoPDMS/AutoPSA/PHS3D需要共享的一些数据库如材料名称库、材料特性库、弹簧库、保温材料库、工程数据库等

├─config			存放配置信息

│  ├─AttConfig		属性配置

│  ├─CataUI			元件库配置

│  │  └─CATALOGUEBMP	元件库位图

│  ├─Color				颜色配置

│  ├─EQUIP			设备样本图

│  ├─EquipConfig	设备类型配置

│  ├─FITT			附件图

│  ├─HvacUI			HVACUI配置

│  │  ├─Hvacdwg		HVAC图纸

│  │  ├─Hvacpng		HVAC位图

│  │  └─HvacSpec	HVAC等级配置

│  │      ├─standard\_a	标准a参数

│  │      └─standard\_b	

│  ├─ICON				图标

│  ├─Isodraft			轴测图，管段图

│  │  ├─Block			dwg格式,设计院图标、材料表格样本

│  │  ├─isoDrawing

│  │  ├─log

│  │  ├─pcfFile			PCF文件配置

│  │  ├─Spec			设置轴测图布局

│  │  ├─Symbol			符号

│  │  ├─SystemIsoFile	未用

│  │  └─Table			表格或图纸布局

│  ├─Options			项目层设置

│  ├─Pipe				配管设置

│  │  └─CII				caesarii材料设置		

│  ├─plandraft			平面图设置

│  │  ├─defaultconfig	默认配置

│  │  └─plandraftpng	图标，bmp和dwg格式

│  ├─StressUI

│  │  └─PCLA			逻辑支吊架位图

│  ├─Struct

│  │  └─BMP				结构符号位图

│  └─TemplateAndBlock	各种表格配置,xml格式

│      ├─CADTemplate	各种表格dwg模板

│      │  └─DraftComp	各种平面图dwg模板

│      ├─ExcelData		Excel格式\label{excelsheet}

│      └─ExcelTemplate	Excel模板格式

├─Help					帮助文档.chm和.doc格式

├─Import				导入配置

├─Project				项目样板数据库

│  ├─MAS

│  │  ├─MAS000

│  │  ├─MASDWG

│  │  ├─MASISO

│  │  ├─MASMAC

│  │  └─MASPIC

│  ├─SAM

│  │  ├─SAM000

│  │  ├─SAMDWG

│  │  ├─SAMISO

│  │  ├─SAMMAC

│  │  └─SAMPIC

│  └─UES

│      ├─UES000

│      ├─UESDWG

│      ├─UESISO

│      │  ├─LIS

│      │  ├─STD

│      │  ├─SYS

│      │  └─UND

│      ├─UESMAC

│      └─UESPIC

└─ProjectInfo		项目路径信息

└─TemplateDataBase	项目数据库模板 \label{templatedatabasedir}

下面解释各目录下的一些文件的作用。

\subsubsection{add-in \label{addin}}
add-in目录存放三种文件：
扩展名为.mns的文件是AutoPDMS软件菜单源文件，它符合AutoCAD菜单文件定义并与AutoCAD菜单文件完全兼容，在AutoPDMS内部，它将完全按AutoCAD规范被处理。这些菜单源文件在第一次加载后将被ACAD编译。

扩展名为.ini的文件是AutoPDMS软件功能模块菜单信息文件，它用于显示模块名称和菜单名称以及查找要加载的arx程序。

AutoPDMSGridTemplate.xml是轴网定义文件。

H:/ Program Files (x86)/ 长沙优易软件开发有限公司/ AutoPDMS10.4.4/ add-in 的目录

2018/01/15  10:11             3,146      AutoPDMS.mns

2013/12/02  17:52               414      AutoPDMSGridTemplate.xml

2015/10/23  10:39             1,204      AutoPDMSToolbar.mns

2016/12/07  16:20             3,633      cata2000.mns

2013/12/02  17:52               119      DefaultPopupMenu.mns

2017/04/07  15:30             1,596      eqtp2000.mns

2017/04/07  15:30             2,946      equi2000.mns

2017/02/11  13:16             4,615      equi2000Toolbar.mns

2017/04/21  13:18             2,535      HS2000.mns

2017/02/09  12:10             1,241      HVAC2000.mns

2013/12/02  17:52               614      Impt2000.mns

2018/01/15  10:16             1,068      Isodraft2000.mns

2013/12/02  17:52               592      ObjectPopupMenu.mns

2017/12/29  14:43             6,190      pds2000.mns

2016/11/07  11:10             3,092      pds2000Toolbar.mns

2013/12/02  17:52               875      PFA2000.mns

2014/01/09  10:14             1,567      proc2000.mns

2013/12/02  17:52             1,772      PSA2000.mns

2014/01/09  10:13             1,943      spec2000.mns

2013/12/02  17:52             2,158      SPOOLER2000.mns

2017/04/07  15:32             3,406      steelwork2000.mns

2015/10/23  10:38             2,109      steelwork2000Toolbar.mns

2013/12/16  11:50               680      UEAutoMatic.ini

2013/12/02  17:52             4,603      UEAutoMatic2000.mns

2013/12/16  11:50               697      UECableTrays.ini

2017/02/09  12:11             1,295      UECableTrays.mns

2013/12/02  17:52               614      UEDesign.ini

2013/12/16  11:50               689      UEDraft.ini

2013/12/02  17:52             6,694      UEDraft2000.mns

2013/12/02  17:52             6,658      UEDrawerBar.mns

2013/12/16  11:50               715      UEEqTp.ini

2013/12/16  11:50               621      UEEqui.ini

2013/12/16  11:50               574      UEhs.ini

2013/12/16  11:50               610      UEHvac.ini

2013/12/16  11:50               640      UEImport.ini

2013/12/16  11:50               633      UEIsoDraft.ini

2013/12/16  11:50               655      UEParagon.ini

2013/12/16  11:50               634      UEPfa.ini

2013/12/16  11:50               655      UEPropcon.ini

2013/12/16  11:50               634      UEPsa.ini

2013/12/16  11:50               681      UESheetAdmin.ini

2013/12/02  17:52             3,821      UESheetAdmin2000.mns

2013/12/16  11:50               608      UESpecon.ini

2013/12/16  11:50               660      UESPOOLER.ini

2013/12/02  17:52             5,802      UEToolbar.mns

2013/12/16  11:50               627      UEXSteel.ini

46 个文件         87,335 字节

\subsubsection{AutoPDMS-2007-Win64 \label{ap2007win64}}
目前有8个形如AutoPDMS-2007-Win64目录，2007代表ObjectARX版本，Win64或Win32代表Windows API的平台字长版本，随着ObjectARX逐步更新，还会出现更多名称的目录。这些目录存放三种文件：

扩展名为.dll的文件大部分是AutoPDMS软件使用的动态库，它是标准的Windows动态库。还有一些是msvc运行时库和版本依赖的ObjectARX动态库、aveva pdms动态库以及个别第三方动态库。

扩展名为.arx的文件是使用ObjectARX开发的AutoPDMS软件 arx动态库，它与AutoCAD运行时库共享地址空间。

还有几个其他类型文件。

 H:/ Program Files (x86)/ 长沙优易软件开发有限公司/ AutoPDMS10.4.4/ AutoPDMS-2007-Win64 的目录

2008/02/10  07:39            71,320      ac1st17.dll

2008/02/10  07:39        18,806,936      acdb17.dll

2008/02/10  07:39         2,031,768      acge17.dll

2017/05/23  17:54           228,352      APACADStart10.exe

2018/06/01  11:14           681,472      APAdminCommon10.dll

2018/06/01  10:54         2,482,688      APAdminDomain10.dll

2018/06/01  11:19         3,911,168      APAdminUI10.exe

2018/06/01  11:05         5,752,832      APArchitectureDomain10.dll

2018/06/01  10:57           921,088      APArxInterface10.arx

2018/06/01  11:14           213,504      APBasicCommand10.arx

2018/06/01  10:33            81,920      APCableTrayCommand10.arx

2018/06/01  10:33           790,528      APCableTrayTransaction10.dll

2018/06/01  11:10           324,096      ApCadReactorTransaction10.dll

2018/06/01  10:39           258,048      APCatalogCommand10.arx

2018/06/01  11:02         4,000,768      APCatalogDomain10.dll

2018/06/01  10:39         2,674,688      APCatalogTransaction10.dll

2018/06/01  11:48           737,280      APClashCommand10.arx

2017/11/20  21:05            81,920      APConnectCheck10.dll

2018/06/01  11:22           337,920      APCustomGripPointEntity10.dbx

2018/06/01  11:22           950,784      APCustomGripPointJig10.dll

2018/06/01  10:33           200,704      APCustomGripPointTr10.dll

2018/06/01  10:50            65,536      APDataBaseDriver10.dll

2018/06/01  11:14           166,400      APDesignCommand10.arx

2018/06/01  11:02           716,800      APDesignDomain10.dll

2018/06/01  11:10           995,328      APDesignOrientation10.dll

2018/06/01  11:09           667,648      APDesignServe10.dll

2018/06/01  11:13         3,997,184      APDesignTransaction10.dll

2018/06/01  10:37           237,568      APDesTemplateCommand10.arx

2018/06/01  10:37         2,166,784      APDesTemplateTransaction10.dll

2018/06/01  10:53         2,215,936      APDomainFrame10.dll

2018/06/01  11:43            42,496      APDraftClash10.dll

2018/06/01  11:47            96,768      APDraftCommand10.arx

2018/06/01  11:45           786,432      APDraftFileAssociator10.dll

2018/06/01  11:45         4,428,288      APDraftModelDomain10.dll

2018/06/01  11:34         3,579,392      APDraftShare10.dll

2018/06/01  10:52         1,486,336      APEDInterpretor10.dll

2018/06/01  10:37           155,648      APEquipCommand10.arx

2018/06/01  11:06         1,583,616      APEquipDomain10.dll

2018/06/01  10:36         7,491,584      APEquipTransaction10.dll

2018/06/01  11:48           654,336      APExportFileCommand10.arx

2018/06/01  11:21           267,776      APExportPSIPCFFile10.dll

2018/06/01  10:37           262,144      APFacadeOfGT10.dll

2018/06/01  10:59         3,772,416      APGeometryTemplate10.dll

2018/06/01  10:50         1,362,432      APGlobalShare10.dll

2018/06/01  11:42           182,784      APGPCF10.dll

2018/06/01  11:48           336,896      APGraphicRVM10.dll

2018/06/01  10:58           169,472      APGraphicSnap10.dll

2018/06/01  11:03         2,996,224      APGTForDesTemplate10.dll

2015/01/21  11:23           139,264      APHSAutoSelDomain10.dll

2015/01/21  11:23           167,936      APHSAutoSelTransaction10.dll

2018/06/01  10:24            49,152      APHSCommand10.arx

2018/06/01  11:18           668,160      APHSDomain10.dll

2015/01/22  09:43           184,320      APHSDraftTr10.dll

2018/06/01  10:19           118,784      APHSModelCreator10.dll

2018/06/01  10:24           598,016      APHSTransaction10.dll

2018/06/01  10:41            77,824      APHvacCommand10.arx

2018/06/01  11:17         1,951,744      APHVACDomain10.dll

2018/06/01  10:41           245,760      APHvacTransaction10.dll

2018/06/01  10:41         2,576,384      APHvacUI10.dll

2017/03/24  10:20            45,056      APImportCommand10.arx

2018/03/29  16:07           811,008      ApImportDomain10.dll

2018/03/29  12:14            73,728      APImportExe10.exe

2018/03/29  12:14           266,240      APImportTransaction10.dll

2018/06/01  11:19            61,440      APLicensedCheck10.dll

2016/04/21  17:51            15,360      APMainLic10.dll

2018/06/01  10:21           409,600      APMenu10.arx

2018/06/01  11:09         1,733,632      APModuleJoinCADShare10.dll

2018/06/01  10:57         3,774,976      APModuleShare10.dll

2018/06/01  11:45           168,960      APPaperDomain10.dll

2018/06/01  11:47         3,464,192      APPaperService10.dll

2018/06/01  11:47           744,960      APPaperUI10.dll

2015/12/03  21:25           691,712      appdmslogin10 .exe

2018/06/01  10:21           552,960      APPDMSLogin10.exe

2018/06/01  11:43           425,984      APPdmspcf10.dll

2018/06/01  10:50           565,248      APPersistentDomain10.dll

2018/06/01  10:50           102,400      APPersistentShare10.dll

2018/06/01  10:33           229,376      APPipeCommand10.arx

2018/06/01  11:08         3,613,696      APPipeDomain10.dll

2018/06/01  11:23         1,755,136      APPipeOrientation10.dll

2018/06/01  11:31        12,834,304      APPipeTransaction10.dll

2018/06/01  11:34           208,384      APPlanDraftAdmin10.dll

2018/06/01  11:42           201,216      APPlanDraftCommand10.arx

2018/06/01  11:37         7,327,232      APPlanDraftDomain10.dll

2018/06/01  11:39         3,419,136      APPlanDraftTransaction10.dll

2018/06/01  11:42         6,636,032      APPlanDraftUI10.dll

2018/06/01  11:15           453,632      APPrimitiveJig10.dll

2018/06/01  11:32           307,712      APPropconCommand10.arx

2018/06/01  11:00         2,442,240      APPropconDomain10.dll

2018/06/01  11:32           153,088      APPropconExe.exe

2018/06/01  11:32           329,216      APPROPCONTRANSCATION10.dll

2018/06/01  11:32           248,832      APPropconUI10.dll

2018/06/01  10:51           144,384      APQuantity10.dll

2018/06/01  11:49           111,616      APRVMCommand10.arx

2018/06/01  10:39            77,824      APSpecCommand10.arx

2018/06/01  11:21         2,422,272      APSpecTransaction10.dll

2018/06/01  11:17         1,089,024      APSpoolerDomain10.dll

2018/06/01  10:18           106,496      APSteelCommand10.arx

2018/06/01  11:16         5,070,848      APSteelTransaction10.dll

2018/06/01  11:08           555,520      APTable10.dll

2018/06/01  11:20            93,184      APTableModelBuildTr10.dll

2018/06/01  11:19           221,696      APTableTransaction10.dll

2018/06/01  10:57           304,640      APTypeDomain10.dll

2018/06/01  10:51            25,600      APUEDockControlBarEx10.dll

2018/06/01  10:51           381,952      APUIShare10.dll

2018/06/01  11:13           106,496      APUPGradeDB.dll

2018/06/01  11:13            64,000      APUPGradeProj.dll

2018/06/01  10:48           125,440      APXmlParser10.dll

2013/07/23  11:45           159,744      cppunit\_dll.dll

2013/07/23  11:46         4,796,416      d3lib.dll

2013/07/23  11:46         4,358,144      d3lib115.dll

2014/08/01  09:28           304,128      DataFormatDlg.dll

2018/06/01  11:09           297,472      DataFormatDlg10.dll

2013/07/23  11:45           427,520      DFORMD.DLL

2018/06/01  11:43           252,928      DraftOptionsDomain10.dll

2018/06/01  11:09           196,096      FillExcelDll10.dll

2018/06/01  11:11           130,048      GetPropertyofMaterial10.dll

2018/06/01  10:33           176,128      GraphicCommOperation10.dll

2018/06/01  11:11         1,074,688      InterfaceAndStruct10.dll

2005/11/11  23:22         1,605,120      mfc80.dll

2005/11/11  23:22         1,602,560      mfc80u.dll

2005/11/11  23:22            63,488      mfcm80u.dll

2005/11/11  23:23               524      Microsoft.VC80.CRT.manifest

2005/11/11  23:23               552      Microsoft.VC80.MFC.manifest

2005/11/11  23:22           516,096      msvcm80.dll

2005/11/11  23:22         1,097,728      msvcp80.dll

2005/11/11  23:22           822,784      msvcr80.dll

2018/06/01  11:11            88,064      PSADomain10.dll

2014/08/01  09:29           229,376      PSAToPDTable.dll

2018/06/01  11:11           232,960      PSAToPDTable10.dll

2014/08/01  09:32            24,064      PSIGlobalShare.dll

2018/06/01  11:21            24,064      PSIGlobalShare10.dll

2018/06/01  11:21           460,800      PSITr10.dll

2010/12/17  01:30            53,536      RelLic64.dll

2011/09/01  16:34             1,480      sntlconfig.xml

2015/10/19  19:14            41,472      UEToolbar.dll

2018/06/01  11:13            45,056      UPGradeDB.exe

2014/08/01  09:28           169,472      WriteTableData.dll

2018/06/01  11:11           182,784      WriteTableData10.dll

2013/07/23  11:45         1,187,840      XT2000Lib.dll

2013/07/23  11:46         1,175,552      XTNET2000Lib.dll

2018/06/01  11:15           224,768      优易设计.arx


\subsubsection{Projectinfo \label{Projectinfodir}}
Projectinfo目录下有2个数据库和一个子目录TemplateDataBase。

H:/ Program Files (x86)/ 长沙优易软件开发有限公司/ AutoPDMS10.4.4/ ProjectInfo 的目录

2018/07/11  12:24           425,984      Projectinfo.mdb

2017/02/17  14:51           212,992      SpecManager.mdb

2018/07/11  12:06    <DIR>          TemplateDataBase

Projectinfo.mdb库存放AutoPDMS软件项目主要数据库目录信息。这个库有2个表：DBType和ProjectInfor。

DBType表结构及示例记录如下：

DBTypeID	DBTypeName	DBTypeLocadName	DBTemplateName	IsCreate

1	DESI	设计	Design.mdb	Yes \label{desigmdb}

2	CATA	元件	CATA.mdb	Yes

3	PADD	平竖面图	PADD.mdb	No

4	ISOD	管道预制图	ISOD.mdb	No

5	PROP	属性	PROPCON.mdb	Yes

6	DICT	用户自定义	DICT.mdb	No

7	COMP			No

8	SPEC	等级	Specification.mdb	Yes

9	BOLT	螺栓	BOLT.mdb	No

10	CCTA	连接	CCTA.mdb	No

11	SYMB			No

12	UNIT			No

13	SCATA	支吊架元件		No

14	DESTEMPLATE	设备模板		No

15	MATL	材料属性		No

16	MATN	材料名		No

17	SPLR	分段下料	Spooler.mdb	No

ProjectInfor表结构及示例记录如下：

ProID	ProName	Number	Desc	Message	MaxNumUser	Lock	HostName	ProPath	isImport	DAC

2	MAS	0	PDMS　Master Released Project		0	No	uesoftgit	\%1\%/ Project/ MAS/ 	Yes	No

3	SAM	0	PDMS　Sample Released Project		0	No	uesoftgit	\%1\%/ Project/ SAM/ 	Yes	No

4	UES	0	UE自带管件模板库		0	No		\%1\%/ Project/ UES/ 	Yes	No

14	MY	30	MYDesc		20	No	uesoftgit	H:/ prj/ MY/ 	No	No

SpecManager.mdb库存放AutoPDMS软件行业分类信息。这个库有1个表：IndustryManager。

IndustryManager表结构及示例记录如下：

IndustryID	IndustryKey	IndustryName	RatingFormat	DefaultRatingFormat	SetGradeKey	SetGradeName
1	GB	国标	法兰公称压力标志 \& 基本材质符号 \& 顺序号			

2	GD	电力行业	法兰公称压力标志 \& 基本材质符号 \& 顺序号		300MW	300MW机组

3	GD	电力行业	法兰公称压力标志 \& 基本材质符号 \& 顺序号		600MW	600MW机组

4	GD	电力行业	法兰公称压力标志 \& 基本材质符号 \& 顺序号		300MW	200MW机组

5	GD	电力行业	法兰公称压力标志 \& 基本材质符号 \& 顺序号		300MW	125MW机组

6	GD	电力行业	法兰公称压力标志 \& 基本材质符号 \& 顺序号		300MW	100MW机组

7	GD	电力行业	法兰公称压力标志 \& 基本材质符号 \& 顺序号		300MW	50MW机组

8	GD	电力行业	法兰公称压力标志 \& 基本材质符号 \& 顺序号		300MW	25MW机组

9	GD	电力行业	法兰公称压力标志 \& 基本材质符号 \& 顺序号		300MW	12MW机组

10	GD	电力行业	法兰公称压力标志 \& 基本材质符号 \& 顺序号		300MW	6MW机组

11	GPS	给排水	法兰公称压力标志 \& 基本材质符号 \& 顺序号			

12	HVAC	暖通空调	法兰公称压力标志 \& 基本材质符号 \& 顺序号			

13	JB	机械行业	法兰公称压力标志 \& 基本材质符号 \& 顺序号			

14	SH	石化行业	法兰公称压力标志 \& 基本材质符号 \& 顺序号		NEW	石化新等级

15	SH	化工行业	基本材质符号 \& 法兰公称压力标志 \& 顺序号		NEW	化工新等级

16	SH	石化行业	法兰公称压力标志 \& 基本材质符号 \& 顺序号		OLD	石化老等级

17	SH	化工行业	基本材质符号 \& 法兰公称压力标志 \& 顺序号		OLD	化工老等级

TemplateDataBase 子目录下存放模板数据库。在建立新工程时，复制这些库到新工程目录下，作为新工程的数据库。

2013/12/02  17:52             6,788      acadiso.lin

2017/02/28  09:22           999,424      Admin.mdb

2013/12/02  17:52           950,272      AdminCATA.mdb

2013/12/02  17:52           970,752      AdminDESI.mdb

2018/03/21  10:41                89      AutoPDMSDBVersion.ini

2018/02/03  12:16         3,489,792      CATA.mdb

2017/05/04  13:54        21,102,592      Design.mdb

2013/12/02  17:52         4,853,760      Draft.mdb

2013/12/02  17:52            96,256      InsulMat.mdb

2013/12/02  17:52         3,074,048      Material.mdb

2013/12/02  17:52           552,960      MaterialName.mdb

2013/12/02  17:52           151,552      Medium.mdb

2013/12/02  17:52               348      ProjectConfig.xml

2013/12/02  17:52           167,936      Projectinfo.mdb

2013/12/02  17:52         1,007,616      PROPCON.mdb

2013/12/02  17:52           700,416      ShareRefInfo.mdb

2013/12/02  17:52           135,168      SpecManager.mdb

2013/12/02  17:52           585,728      Spooler.mdb

2013/12/02  17:52           593,920      Spring.mdb

\subsubsection{Project SAM SAM000 \label{sam000}}
SAM000是AutoPDMS软件自带的工程例题SAM的项目主要数据库目录，位于目录Project/ SAM/ SAM000下。MAS是AutoPDMS软件自带的另外一个工程例题MAS的目录。在SAM目录下有4个目录：SAM000目录存放了整个sam工程的所有数据库，按照最初的规划，SAMDWG目录存放整个sam工程的所有图纸，SAMISO目录存放整个sam工程ISO轴测图，SAMMAC目录存放整个sam工程用的宏语言，但实际没有完全实现这个架构。后面详细介绍SAM000数据库的结构。

H:/ Program Files (x86)/ 长沙优易软件开发有限公司/ AutoPDMS10.4.4/ Project/ SAM/ SAM000 的目录

2018/07/11  12:25               128      Admin.ldb

2018/07/11  12:25         1,216,512      Admin.mdb

2018/03/21  10:41                89      AutoPDMSDBVersion.ini

2013/12/02  17:52             2,019      ListNode.xml

2013/12/02  17:52             8,991      P227C.psa

2018/03/21  14:16        13,570,048      SAM003.mdb

2013/12/02  17:52         2,686,976      SAM021.mdb

2017/05/04  14:15         6,574,080      SAM7009\_0001.mdb

2017/05/04  14:15         8,077,312      SAM7011\_0001.mdb

2018/07/11  12:25                 0      SAM7015\_0001.ldb

2018/07/11  12:25        10,407,936      SAM7015\_0001.mdb

2017/05/04  14:15         6,610,944      SAM7110\_0001.mdb

2017/05/04  14:15         6,336,512      SAM7120\_0001.mdb

2013/12/02  17:52         3,211,262      SAM713.rra

2017/05/04  14:16         6,295,552      SAM7130\_0001.mdb

2018/07/11  12:25                 0      SAM7140\_0001.ldb

2018/07/11  12:25         6,836,224      SAM7140\_0001.mdb

2013/12/02  17:52                64      SAM7141\_0001.ldb

2013/12/02  17:52         2,805,760      SAM7141\_0001.mdb

2013/12/02  17:52                64      SAM7143\_0001.ldb

2013/12/02  17:52           626,688      SAM7143\_0001.mdb

2017/05/04  14:16         6,324,224      SAM7145\_0001.mdb

2017/05/04  14:16         6,631,424      SAM7150\_0001.mdb

2017/05/04  14:16         6,295,552      SAM7160\_0001.mdb

2018/03/21  14:16         2,220,032      SAM7161\_0001.mdb

2017/05/04  14:16        10,776,576      SAM7200\_0001.mdb

2013/12/02  17:52         6,217,728      SAM7201\_0001.mdb

2013/12/02  17:52                64      SAM7203\_0001.ldb

2013/12/02  17:52         3,584,000      SAM7203\_0001.mdb

2017/05/04  14:16         6,885,376      SAM7624\_0001.mdb

2017/05/04  14:16         6,414,336      SAM7625\_0001.mdb

2017/05/04  14:16         6,692,864      SAM7627\_0001.mdb

2017/05/04  14:17         6,529,024      SAM7628\_0001.mdb

2017/05/04  14:17         6,324,224      SAM7631\_0001.mdb

2017/05/04  14:17         6,455,296      SAM7632\_0001.mdb

2017/05/04  14:17         6,696,960      SAM7633\_0001.mdb

2018/03/21  14:16         2,134,016      SAM7635\_0001.mdb

2018/03/21  14:16        29,888,512      SAM7636\_0001.mdb

2013/12/02  17:52         5,050,368      SAM7637\_0001.mdb

2013/12/02  17:52         3,710,976      SAM7999\_0001.mdb


\section{下载和编译AutoPDMS源代码 \label{downloadbuild}}

\subsection{源代码安装目录 \label{srcfolder}}
为了使用Microsoft Visual Studio批处理代码自动构建AutoPDMS9.0，编写了自动编译AutoPDMS批处理脚本代码，放在e:/vc/autopdms9.0/AutoBuild/目录下。请按这些批处理脚本代码的规定，设置各种目录位置，下面有些信息描述了这些目录位置。

\subsection{开发工具 \label{devtools}}

开发AutoPDMS需要如下工具，可以从互联网下载这些开发工具。如果你在长沙优易软件开发有限公司从事开发工作，可以从公司服务器//systemuk/g下载相关工具。
\begin{itemize}
\item Microsoft Visual Studio 2005
使用VC++2005编译AutoPDMS。可以从公司局域网文件服务器 / / Systemuk/ g/ 开发工具/ VC各版本/ vs2005/ vs2005文件夹安装vc2005到本机。
\end{itemize}

\subsection{下载所需软件}

\begin{itemize}
\item AutoCAD2007
调试或测试AutoPDMS的arx程序需要acad2007，acad2007安装文件在公司服务器/ / systemuk/ G/ AutoCAD/ AutoCAD 2007 CHS 简体中文版/ acadFeui 
\item AutoPDMS
可以从公司服务器/ / systemuk/ H/ 各种安装包/ TEST/ 最新安装包/ AutoPDMS9.0 安装最新版本AutoPDMS软件，以得到配置好的项目元件库等级库设计库等，以免浪费时间配置数据库。
\end{itemize}

\subsection{下载代码库}

\begin{itemize}
	\item ObjectARX 2007(Autodesk提供的AutoCAD开发代码库)
可以从公司服务器 / / systemuk/ D/ ObjectArx库和boost/ ObjectARX 2007解压缩objectarx2007到本机e:/ vc/ objectarx 2007目录下，或者从其他开发人员配置好的机器上复制e:/vc/objectarx 2007目录到本机e:/vc/objectarx 2007 
	\item cppunit-1.11.0(cpp单元测试库)
	\item boost(著名的c++库，和正则表达式库)
可以从公司服务器/ / systemuk/ D/ PROJECTSUPPORT 复制子目录boost和子目录 cppunit-1.11.0到本机d:/ PROJECTSUPPORT目录
	\item ShareDLL(UESOFT开发的公共库，用于AutoPDMS、AutoPSA、PHS3D等软件)
可以从公司服务器或https://gitee.com/uksoft2013/sharedll下载
	\item AutoPDMS9.0
可以从公司服务器或https://gitee.com/uesoft/autopdms9.0下载，放到本机文件夹e:/vc/
\end{itemize}

\subsection{编译步骤}
\subsection{下载并安装软件}
按照\ref{downloadbuild}节要求，下载并安装软件，下载相关源代码。注意目录位置要符合节\ref{srcfolder}描述，否则要修改AutoBuild自动编译脚本文件中的目录位置。

\subsection{设置VC++环境}
按照软件安装目录和各种源代码库存放目录，设置VC++环境，如解决方案目录等。当按照\ref{downloadbuild}节规定的目录安装后，可以简化环境设置，从我们公司已经配置好的VC++软件解决方案AutoPDMS导出一个配置文件存放在公司服务器//Systemuk/D/UESoft-RD/新员工培训文档/Exported-2018-07-18-1.vssettings，启动本机VC2005，点击菜单：工具-导入和导出设置-选择导入的环境设置-下一步，导入这个配置文件，即可设置好本机VC++编译AutoPDMS代码的环境。

\subsection{编译代码}

\subsubsection{编译第一类工程：底层的、共用的工程}
APGlobalShare;FrameWork/ APUIShare;Persist/ APPersistentShare;Persist/ APPersistentMapper;DataBase/ APDataBaseDriver;Persist/ APPersistentDomain;Design/ Steel/ APCadReactor;Graphic/ APUEDockControlBar;Graphic/ APArxInterface;Graphic/ APBaseEntity;FrameWork/ APQuantity;Graphic/ APEDInterpretor;FrameWork/ APXmlParser;FrameWork/ apdomainframe;升级/ APUPGradeDB;升级/ APUPGradeProj;升级/ UpGradeDB;Admin/ APAdminDomain;Admin/ APAdminCommon;FrameWork/ APGRAPHICSNAP;GraphicOperation/ APCustomEntity;Graphic/ APGemetryRepresentation;Table/ Table)
\begin{itemize}
	\item 启动Microsoft Visual Studio 2005
	\item 打开APGlobalShare.vcproj项目
	\item 添加项目,添加 APGlobalShare.vcproj, FrameWork/ APUIShare.vcproj等上述第一类工程,如图\ref{apuishare}:
\end{itemize} 

\begin{figure}
	\epsfig{file=apuisharevcproj.eps,width=8cm}
	\caption{添加 APGlobalShare.vcproj, \label{apuishare}}
\end{figure}

\begin{itemize}
	\item 设置Microsoft Visual Studio包含文件(工具-选项-项目和解决方案-VC++目录,选择包含文件):
包含ObjectARX 2007文件(包含E:/ vc/  ObjectARX 2007, E:/ vc/  ObjectARX 2007/ utils/ amodeler/ )；
包含cppunit-1.11.0文件(包含d:/ PROJECTSUPPORT/ cppunit-1.11.0/ include/ )
包含boost文件(包含D:/ PROJECTSUPPORT/ boost/ )；
包含其它软件公共文件(E:/ vc/ sharedll/ InterfaceAndStruct/ inc，E:/ vc/ sharedll/ PSADoamin/ inc, E:/ vc/ sharedll/  etPropertyofMaterial/ inc,E:/ vc/ sharedll/ PSATableData/ inc，E:/ vc/ sharedll/ PSAToPDTable/ inc, E:/ vc/ sharedll/ WriteTableData/ inc)；
包含第一类工程文件(包含FrameWork/ APUIShare/ inc, Persist/ APPersistentShare/ inc……上述的第一类工程所有库文件)。
	\item 设置Microsoft Visual Studio包含库文件
包含ObjectARX 2007库文件(包含E:/ vc/  ObjectARX 2007/ lib)；
包含cppunit-1.11.0库文件(包含D:/ PROJECTSUPPORT/ cppunit-1.11.0/ lib/ )
包含boost库文件(包含D:/ PROJECTSUPPORT/ boost/  libs/ vc80)；
包含其它软件公共库文件(E:/ vc/ sharedll/ libd)；
包含第一类工程库文件(包含d:/ uelib/ libd,所有编译的库都放到此目录)。
\end{itemize} 

\subsubsection{编译第一类工程库}
(可以手工单个编译或使用批生成，批生成如图\ref{batchbuild}:)
\begin{figure}
	\epsfig{file=batchbuild.jpg,width=12cm}
	\caption{批生成, \label{batchbuild}}
\end{figure}

\setlength{\unitlength}{1mm}
\begin{center}
	\begin{figure}[!htbp]\scalebox{-0.5}{\rotatebox{180}{\includegraphics{batchbuild.jpg}}}
	\end{figure}
\end{center}

\subsubsection{编译第二类工程：上层的部分工程}
(Graphic/ APEDInterpretor;Graphic/ ApGraphicManager;FrameWork/ APPdmsParse;FrameWork/ APCommonTransaction;FrameWork/ APTypeDomain;FrameWork/ APCOMMONUI;CommonModule/ APGraphicsSetting;Catalogue/ APGeometryTemplate;Catalogue/ APCatalogDomain;Propcon/ APPropconDomain;Specification/ APSpecDomain;Design/ APDesignDomain;Design/ APDesignShare;Design/ Pipework/ APPipeDomain;Design/ Equipment/ APEquipDomain;Design/ HVAC/ APHVACDomain;Design/ HS/ APHSDomain;Stress/ APStressDomain;Design/ APDesignFunctionShare;Design/ APDesignOrientation;Design/ Pipework/ APPipeOrientation;CommonModule/ APApplicationShare;CommonModule/ APNavigationUI;CommonModule/ APCommandLineUI;CommonModule/ APCommonUtilities;CommonModule/ APAttributeUI;)
1.	添加项目,添加Graphic/ APEDInterpretor.vcproj, Graphic/ ApGraphicManager.vcproj……等上述第二类工程
2.	设置Microsoft Visual Studio包含文件
包含第二类工程文件(包含Graphic/ APEDInterpretor/ inc, Graphic/ ApGraphicManager/ inc……上述的第二类工程所有库文件)
3.	编译第二类工程库,可以手工单个编译或使用批生成

\subsubsection{编译第三类工程：上层的部分工程}
(Table/ DataFormatDlg;Design/ Equipment/ APGTForDesTemplate;/ GraphicOperation/ APGraphicOperationTranscation;Design/ Steel/ APArchitectureDomain;CadReactor/ APCadReactorTransaction;RegisterCadCommand/ APBasicCommand;Spooler/ APSpoolerDomain;Spooler/ APSpoolerFunctionShare;Design/ APDesignTransaction;Design/ Equipment/ APDesTemplateDomain;Design/ Equipment/ APEquipOrientation;Design/ Equipment/ APEquipBaseTranscation;Design/ Equipment/ APDesPrimitivesTransaction;Design/ Equipment/ APDesTemplateTransaction;Design/ Equipment/ APEquipTransaction;RegisterCadCommand/ APEquipCommand;ClashDetection/ ApClashDomain;ClashDetection/ APClashDetection;ClashDetection/ APClashUI;RegisterCadCommand/ APClashCommand;Design/ APConnectCheck;Design/ Pipework/ APDesignRouteArithmetic;GetPropertyofMaterial;Design/ Pipework/ APPipeOrientation;Specification/ APSpecTransaction;Design/ Pipework/ APPipeTransaction;Design/ Pipework/ APDesignRouteUI;Design/ APDesignDataCheck;Design/ Pipework/ APPipeDataConsistency;RegisterCadCommand/ APDesTemplateCommand;RegisterCadCommand/ APPipeCommand;)
1.	添加项目,添加Table/ DataFormatDlg.vcproj,Design/ Equipment/ APGTForDesTemplate.vcproj……等上述第三类工程
2.	设置Microsoft Visual Studio包含文件
包含第三类工程文件(包含Table/ DataFormatDlg/ inc, Design/ Equipment/ APGTForDesTemplate/ inc……上述的第三类工程所有库文件)
3.	编译第三类工程库,可以手工单个编译或使用批生成

\subsubsection{编译第四类工程：上层的部分工程}
(Design/ Steel/ APSteelDesignArithmetic;Design/ Steel/ APSteelCommonService;Design/ Steel/ APSteelNodeDesignDomain;Design/ Steel/ APSteelDesignOrientation;Design/ Steel/ APSteelTransactionShare;Design/ Steel/ APSteelDesignUI;Design/ Steel/ APSteelCommonTransaction;RegisterCadCommand/ APSTEELCOMMAND;Design/ HVAC/ APHvacUI;Design/ HVAC/ APHvacTransaction;RegisterCadCommand/ APHvacCommand;Design/ Pipework/ APDesignRouteUI;Design/ APDesignDataCheck;Table/ APTableTransaction;/ GraphicOperation/ APGraphicOperationTranscation;RegisterCadCommand/ APDesignCommand;RegisterCadCommand/ APPipeCommand;Design/ APDesignTransaction;Design/ Steel/ APArchitectureDomain;Design/ HS/ APHSModelCreator;Design/ HS/ APHSTransaction;RegisterCadCommand/ APHSCommand;Design/ CableTrays/ APCableTrayTransaction;RegisterCadCommand/ APCableTrayCommand;CadReactor/ APCadReactorTransaction;Design/ Equipment/ APGTForDesTemplate;Design/ Pipework/ APPipeTransaction;Table/ DataFormatDlg;PlanDraft/ APPlanDraftAdmin;PlanDraft/ APPlanDraftDomain;PlanDraft/ APPlanDraftTransaction;PlanDraft/ APPlanDraftUI;RegisterCadCommand/ APBasicCommand;RegisterCadCommand/ APPlanDraftCommand;)
1.	添加项目,添加Design/ Steel/ APSteelDesignArithmetic.vcproDesign/ Steel/ APSteelCommonService.vcproj……等上述第四类工程
2.	设置Microsoft Visual Studio包含文件
包含第四类工程文件(包含Design/ Steel/ APSteelDesignArithmetic/ inc,Design/ Steel/ APSteelCommonService/ inc……上述的第四类工程所有库文件)
3.	编译第四类工程库,可以手工单个编译或使用批生成

\subsubsection{编译第五类工程：上层的部分工程}
（/ AutoPSA8.0/ InterfaceAndStruct;Spooler/ APSpoolerDomain;Design/ Equipment/ APGTForDesTemplate;Spooler/ APSpoolerFunctionShare;Draft/ APPdmspcf/ GPCF;Draft/ APPdmspcf/ pdmspcf;DraftCommon/ APDraftClash;Draft/ DraftOptionsDomain;Draft/ APDraftModelDomain;RegisterCadCommand/ APBasicCommand;AutoPSA8.0/ PSADomain;Interface/ APCommanModelDomain;AutoPSA8.0/ GetPropertyofMaterial;/ Interface/ PSAInterfaceTransaction;Table/ DataFormatDlg;Draft/ APDraftFileAssociator;Draft/ APDrawGrid;Draft/ APIDFAssociator;Draft/ APPaperDomain;Draft/ APPaperService;Draft/ APPaperUI;Draft/ APTableModelBuildTr;RegisterCadCommand/ ApDraftCommand;RegisterCadCommand/ APExportFileCommand;Design/ APDesignTransaction;Stress/ APStressDomain;Stress/ APStressModelDomain;Stress/ APStressModelCreator;Stress/ APStressResultUI;Design/ Pipework/ APPipeTransaction;Stress/ APStressUI;Stress/ APStressTranscation;RegisterCadCommand/ APStressCommand;StartMoudle/ APACADStart;）
1.	添加项目,添加 AutoPSA8.0/ InterfaceAndStruct.vcproj, Spooler/ APSpoolerDomain.vcproj等上述第五类工程
2.	设置Microsoft Visual Studio包含文件
包含第五类工程文件(包含AutoPSA8.0/ InterfaceAndStruct/ inc, Spooler/ APSpoolerDomain/ inc……上述的第四类工程所有库文件)
3.	编译第五类工程库,可以手工单个编译或使用批生成

\subsubsection{编译第六类工程：上层的部分工程}

（Spooler/ APSpoolerDomain;Design/ Equipment/ APGTForDesTemplate;Spooler/ APSpoolerFunctionShare;Design/ Pipework/ APPipeTransaction;Spooler/ APSpoolerTransaction;Table/ APTableTransaction;Design/ Steel/ APCadReactor;CadReactor/ APCadReactorTransaction;RegisterCadCommand/ APSpoolerCommand;Catalogue/ APFacadeOfGT;Catalogue/ APCatalogTransaction;RegisterCadCommand/ APBasicCommand;RegisterCadCommand/ APCatalogCommand;Specification/ APSpecTransaction;RegisterCadCommand/ APSpecCommand;Propcon/ APPropconUI;Propcon/ APPropconTranscation;RegisterCadCommand/ APPropconCommand;AutoPDMSInterface/ StructuralAnalysisInterface/ APSTDFileExport;PDMSDataExportModule/ ApImportDomain;PDMSDataExportModule/ APImportTransaction;RegisterCadCommand/ APImportCommand;PDMSDataExportModule/ APImportExe;FrameWork/ APPopupMenu;Design/ Equipment/ APGTForDesTemplate;Design/ Pipework/ APPipeTransaction;Design/ APDesignTransaction;Admin/ APAdminDomain;Admin/ APAdminUI;StartMoudle/ APPDMSLogin;Stress/ APStressModelCreator;Stress/ APStressResultUI;Spooler/ APSpoolerDomain;Draft/ APPaperUI;Draft/ APPdmspcf/ pdmspcf;RegisterCadCommand/ APBasicCommand;RegisterCadCommand/ ApPfaCommand;Table/ Table;RegisterCadCommand/ APPfaDrawTbCommand;）
1.	添加项目,添加 Spooler/ APSpoolerDomain.vcproj, Spooler/ APSpoolerDomain.vcproj等上述第五类工程
2.	设置Microsoft Visual Studio包含文件
包含第六类工程文件(包含AutoPSA8.0/ InterfaceAndStruct/ inc,Design/ Equipment/ APGTForDesTemplate/ inc……上述的第六类工程所有库文件)
3.	编译第六类工程库,可以手工单个编译或使用批生成

\subsubsection{批处理自动编译}
在本机e:/vc/autopdms8.0/AutoBuild目录下，有许多批处理编译脚本文件，用于自动编译AutoPDMS项目的全部工程，生成32或64位的代码版本，这些版本对应于AutoCAD2007-2017的各个版本。
请注意，为了让批处理编译脚本正常运行，必须保证各种目录与批处理脚本文件中的目录变量设置一致，也就是要按照2-5节描述的目录存放各种软件和代码。

\subsection{调试代码}
\subsubsection{调试设计模块}
1.	启动VC2005，设置APDesignCommand为启动项目

2.	调试-启动调试，选择AutoCAD2007的执行文件acad.exe

3.	在AutoCAD命令行中输入”arx”回车，”L”回车，选择APDesignCommand10d.arx

4.	加载成功后会看到右边的抽屉工具栏

5.	输入showdesign命令，会看到导航栏

6.	可以加载菜单(输入”arx”回车，”L”回车,选择APMenu10d.arx),加载成功会看到设计模块的菜单

\subsubsection{调试其它模块}
1.	元件库模块,对应的Arx文件: APCatalogCommand10d.arx

2.	等级库模块,对应的Arx文件: APSpecCommand10d.arx

3.	属性库模块,对应的Arx文件: APPropconCommand10d.arx

4.	属性库模块,对应的Arx文件: APPropconCommand10d.arx

5.	Spooler模块,对应的Arx文件:APSpoolerCommand10d.arx

6.	导出模块,对应的Arx文件: APImportCommand10d.arx

7.	平/断面模块,对应的Arx文件:APPlanDraftCommand10d.arx

8.	轴测图模块,对应的Arx文件:APDraftCommand10d.arx

调试步骤和上述调试设计模块一样。

\section{AutoPDMS工作过程分析 \label{apflow}}
AutoPDMS运行流程为：首先显示AutoPDMS登录界面，用户选择各种参数，启动一个AutoCAD实例，在AutoCAD加载arx程序，显示树形数据界面，显示菜单，进入选择的模块，默认是设计模块，管道设计模块，开始设计任务。

在设计过程中，可以随时切换到其他设计模块如结构、HVAC、设备、支吊架等模块，或者切换到元件库、等级库、属性库、多用户权限管理等模块。

每次只能设计一个工程。如果在设计时要选择另外一个工程项目，只能保存工程，退出当前工程，重新启动AutoPDMS软件开始登录选择。

\subsection{登录AutoPDMS}

AutoPDMS数据库采用Access数据库，数据按工程进行存放，数据库的管理统一由Admin模块负责。
存放模块中节点数据的数据库中除包括各域节点表以外，必须包括DBInfo表和PaternityMap表。
各节点表中必须要包括ID和Name字段。

\section{AutoPDMS数据库结构\label{apdbstruct}}
AutoPDMS持久层把工程项目持久化数据保存在数据库\ref{sam000}中，目前数据库格式采用了ACCESS格式。
工程项目数据库存放路径为AutoPDMS软件安装目录下的project
在AutoPDMS安装目录/ project下有三个工程例题sam,mas,ues，它们的结构与任何工程数据库结构都是相同的。现在先介绍AutoPDMS数据库访问流程，再以sam工程为例，介绍AutoPDMS数据库结构。

\subsection{AutoPDMS数据库访问流程}

\subsection{AutoPDMS数据库结构}
数据库存储结构如下：

\section{持久层}
持久化（Persistence），即把数据（如内存中的对象）保存到可在以后恢复数据的存储设备中（如磁盘）。

持久化是将程序数据在持久状态和瞬时状态间转换的机制。

所谓“持久层”，是软件中实现数据持久化的一个相对独立的域(Domain)，持久层是在数据结构和持久存储数据之间读写数据的一组软件。

这个层必须包括一个业务领域实体的模型（即使只是一个元数据模型）。

\subsection{持久化设备}
能够断电保存数据很长时间而不损坏数据的设备如磁盘等，称为持久化设备。
这与RAM等随机存储器断电以后数据无法恢复形成了鲜明对比。

由于如下原因，持久化设备必不可少，一是内存空间不可能无穷大，因此内存不可能存放所有数据；二是即使内存有无穷大空间，也有断电导致内存数据丢失的可能；以及其它原因。

\subsection{持久层简史}
对于应用系统而言，数据持久功能大多是必不可少的组成部分。

自计算机发明以来，数据持久层技术不断发展。

\subsubsection{文件系统}
最初通过直接读写文件实现持久化。

文件系统是操作系统用于明确存储设备（常见的是磁盘，也有基于NAND Flash的固态硬盘）或分区上的文件的方法和数据结构；即在存储设备上组织文件的方法。操作系统中负责管理和存储文件信息的软件机构称为文件管理系统，简称文件系统。文件系统由三部分组成：文件系统的接口，对对象操纵和管理的软件集合，对象及属性。从系统角度来看，文件系统是对文件存储设备的空间进行组织和分配，负责文件存储并对存入的文件进行保护和检索的系统。具体地说，它负责为用户建立文件，存入、读出、修改、转储文件，控制文件的存取，当用户不再使用时撤销文件等。

\subsubsection{数据库}
1970年E.J. Codd 发表了关系数据库理论（relational  database theory）。

\subsubsection{SQL}
关系型数据库产生后很快就成为数据库系统的主流产品，由于每个DBMS厂商都有自己的一套标准，人们很早就产生了标准化的想法。

1974年-1979年：IBM 以Codd的理论为基础开发了“Sequel”，并重命名为"SQL"。

由于SQL语法规范逐渐为人所接受，成为RDBMS上的主导语言。

最初，各数据库厂商为了解决互连的问题，往往提供嵌入式SQL API，用户在客户机端要操作系统中的RDBMS时，一般要在程序中嵌入SQL语句进行预编译。

由于不同厂商在数据格式、数据操作、具体实现甚至语法方面都具有不同程度的差异，所以彼此不能兼容。

长期以来，这种API的非规范情况令用户和RDBMS厂商都不满意。

\subsubsection{CLI}
1980年代后期，一些著名的厂商包括Oracle、Sybase、Lotus、Ingres、Informix、HP、DEC等结成了SQL Access Group（简称SAG），提出了SQL API的规范核心：调用级接口（Call Level Interface），简称CLI。

\subsubsection{ODBC}
1991年11月，微软宣布了开发数据库连接ODBC，次年推出可用版本。

1992年2月，推出了ODBC SDK 2.0版。ODBC基于SAG的SQL CAE草案所规定的语法，共分为Core、Level 1、 Level 2三种定义，分别规范了22、16、13共51条命令，其中29条命令甚至超越了SAG CLI中原有的定义，功能强大而灵活。它还包括标准的错误代码集、标准的连接和登录DBMS方法、标准的数据类型表示等。

由于ODBC设计架构和实现的先进性，且没有同类的标准或产品与之竞争，它一枝独秀，推出后仅仅两三年就受到了众多厂家与用户的青睐，成为一种广为接受的标准。目前，已经有130多家独立厂商宣布了对ODBC的支持，常见的DBMS都提供了ODBC的驱动接口，这些厂商包括Oracle、Sybase、Informix、Ingres、IBM(DB/2)、DEC(RDB)、HP(ALLBASE/SQL)、Gupta、Borland(Paradox)等。目前，ODBC已经成为客户机/服务器系统中的一个重要支持技术。

\subsubsection{JDBC}
JDBC试图模仿ODBC的成功。

Java程序是通过JDBC(Java Data Base Connectivity)连接数据库的，JDBC是由SUN公司提出的一系列规范，但是它只定义了接口的规范，各个数据库厂商实现具体接口，JDBC是一种典型的桥接模式。

JDBC编程步骤

使用JDBC编程需要连接数据库，注册驱动和数据库信息
操作Connection,打开Statement对象
通过Statement执行SQL,返回结果到ResultSet对象
使用ResultSet读取数据，然后通过代码转换为具体的POJO对象
关闭数据库相关资源

JDBC弊端

工作量大
编程复杂

\subsubsection{ORM}

ODBC和JDBC编程方式统一了连接不同厂家数据库的接口，但开发效率仍然很低，要写许多重复代码，加上关系数据库和对象本身存在所谓的阻抗不匹配情况，所以为了提高开发效率，有人发明了ORM 即对象关系映射框架(Object Relational Mapping,ORM)。程序员使用这些ORM框架，可以通过操纵对象来操纵数据库。

所有的ORM都是基于ODBC或JDBC进行封装的，不同ORM模型对ODBC或JDBC封装的强度是不一样的。

ORM框架是数据库的表和简单c/c++或Java对象的映射关系模型，通过映射关系就可以把数据库表的数据转化为POJO。

\subsection{持久层框架}

在ORM中，有许多开源的框架。最著名的两个java对象关系映射框架是Hibernate和MyBatis。
AutoPDMS参考了一些开源框架，采用修改的ORB作为C++持久层框架。

\subsubsection{CppHibernate}
CppHibernate可以让你在C++项目中使用Java的Hibernate框架，使用相同的配置文件，包括：hibernate.cfg.xml和XXX.hbm.xml。它通过JNI方式调用Hibernate的方法。

\subsubsection{ODB}
ODB是一个开源的，支持多平台，支持多数据库的C++的ORM框架，可将C++对象数据库表映射，进行轻松的数据库查询和操作。

示例代码：

person john ("John", "Doe", 31);

person jane ("Jane", "Doe", 29);

transaction t (db.begin ());

db.persist (john);

db.persist (jane);

result r (db.query<person> (query::age < 30));

copy (r.begin (), r.end (), ostream\_iterator<person> (cout, "/ n"));

jane.age (jane.age () + 1);

db.update (jane);

t.commit ();

\subsubsection{Hibernate}
Hibernate是一个开放源代码的对象关系映射框架，一问世就成为了Java世界首选的ORM框架，它建立在POJO和数据库表模型的直接映射关系上。

Hibernate对JDBC进行了非常轻量级的对象封装，使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。 Hibernate可以应用在任何使用JDBC的场合，既可以在Java的客户端程序使用，也可以在Servlet/JSP的Web应用中使用，最具革命意义的是，Hibernate可以在应用EJB的J2EE架构中取代CMP，完成数据持久化的重任。


Hibernate优势

消除了代码的映射规则，它全部被分离到了XML或者注解里面去配置

无需再管理数据库连接，它也可以配置在XML里面

一个会话中，不要操作多个对象，只要操作Session对象即可

关闭资源只需要关闭一个Session便可


Hibernate缺陷

全表映射带来了不便，比如更新时需要发送所有的字段

无法根据不同的条件组装不同的SQL

对多表关联和复杂SQL查询支持较差，需要自己写SQL，返回后，需要自己将数据组装为POJO

不能有效支持存储过程

虽然有HQL，但是性能较差， 大型互联网系统往往需要优化SQL，而hibernate做不到


\subsubsection{MyBatis}

为了解决Hibernate的不足，一个半自动映射的框架MyBatis应运而生。

mybatis是一个java持久层框架，它封装少、高性能、可优化、维护简单，成为java移动互联网网站服务的替代Hibernate的持久层框架，它特别适合分布式和大数据网络数据库编程。
之所以称它为半自动，是因为它需要手工匹配提供POJO、SQL和映射关系，而全表映射的Hibernate只需要提供POJO和映射关系便可。


历史

Mybaits的前身是Apache的一个开源项目iBatis，2010年这个项目由apache software foundation 迁移到了 google code，并且改名为Mybatis，2013年11月迁移到Github,目前mybaits是在Github维护的。

名称

iBatis一词来源于“internet”和“abatis”的组合。

mybaits所需要提供的映射文件包含以下三个部分：

SQL
映射规则
POJO

什么时候用mybaits？

hibernate只适用于场景不太复杂，要求性能不太苛刻的时候。

mybatis拥有动态列，动态表名，存储过程支持，同时提供了简易的缓存、日志、级联，但是它的缺陷是需要你提供映射规则和sql，不能象Hibernate那样自动生成SQL语句，所以它的开发工作量比Hibernate略大一些。

\subsubsection{hadoop}

伴随google的崛起，分布式框架hadoop很快取代了ORM。

Hadoop原本来自于谷歌一款名为MapReduce的编程模型包。谷歌的MapReduce框架可以把一个应用程序分解为许多并行计算指令，跨大量的计算节点运行非常巨大的数据集。使用该框架的一个典型例子就是在网络数据上运行的搜索算法。Hadoop最初只与网页索引有关，迅速发展成为分析大数据的领先平台。

Hadoop实现了一个分布式文件系统（Hadoop Distributed File System），简称HDFS。HDFS有高容错性的特点，并且设计用来部署在低廉的（low-cost）硬件上；而且它提供高吞吐量（high throughput）来访问应用程序的数据，适合那些有着超大数据集（large data set）的应用程序。HDFS放宽了（relax）POSIX的要求，可以以流的形式访问（streaming access）文件系统中的数据。
Hadoop的框架最核心的设计就是：HDFS和MapReduce。HDFS为海量的数据提供了存储，则MapReduce为海量的数据提供了计算。

\subsubsection{其他分布式框架}

Key-value NoSQL，例如Redis、Riak等；

column family NoSQL(wide column store)，典型的是Hbase、Cassandra；

document NoSQL,典型的是mongodb；

开源的图数据库有Neo4j;

分布式关系数据库（SQL完全兼容）分析型的有GreenPlum（商业版的OLAP很多，开源的少），事务型开源的有Voltdb;还有一些基于proxy实现关系数据库集群（很多互联网公司都有类似mysql fabric的产品），当然这些并非真正意义上的分布式数据库；

还有一些基于开源的NoSQL分布式存储基础上研发的分布式OLTP数据库（类似spanner），数据模型和事务支持，介于关系数据库和NoSQL之间，例如Atlasdb（基于cassandra）、cockroachdb（仿照F1）等。分布式OLTP的发展还不是太成熟，还有一个calvin的项目（非2PC）值得关注，基于VLDB2014年的论文；国内一有个TiDB的项目，也比较值得关注。

开源的消息队列也非常多，应用广泛程度不亚于nosql存储。有些对事物支持比较好的消息队列，例如rabbitmq active mq等；还有很多的kafka，主要做日志处理。消息队列的核心关注点就是一个消息at least once， at most once， only once。

分布式计算框架，典型的有基于mapreduce的hadoop，基于内存计算的spark。基于mapreduce的计算框架是基于有限数据集，而面向无限数据集的流计算矿建也比较多，例如storm，Flink，samza等等也不少。

\subsubsection{AI与深度学习框架}
面向机器学习的分布式计算框架tensorflow、mxnet、caffe等（需要支持GPU计算框架cuda等），架构特点跟其他计算框架有很大不同，主要建模对象是卷积神经网络，需要进行大量的迭代运算，往往会采用一个全局的参数服务器存放迭代计算的中间结果。

\subsubsection{区块链}
区块链是分布式数据存储、点对点传输、共识机制、加密算法等计算机技术的新型应用模式。所谓共识机制是区块链系统中实现不同节点之间建立信任、获取权益的数学算法。

区块链（Blockchain）是比特币的一个重要概念，它本质上是一个去中心化的数据库，同时作为比特币的底层技术。区块链是一串使用密码学方法相关联产生的数据块，每一个数据块中包含了一次比特币网络交易的信息，用于验证其信息的有效性（防伪）和生成下一个区块。

用通俗的话阐述：如果我们把数据库假设成一个账本，读写数据库就可以看做一种记账的行为，区块链技术的原理就是在一段时间内找出记账最快最好的人，由这个人来记账，然后将账本的这一页信息发给整个系统里的其他所有人。这也就相当于改变数据库所有的记录，发给全网的其他每个节点，所以区块链技术也称为分布式账本（distributed ledger）。

区块链技术被认为是继蒸汽机、电力、互联网之后，下一代颠覆性的核心技术。 如果说蒸汽机释放了人们的生产力，电力解决了人们基本的生活需求，互联网彻底改变了信息传递的方式，那么区块链作为构造信任的机器，将可能彻底改变整个人类社会价值传递的方式和社会管理的基础。

\subsection{AutoPDMS持久层原理}

AutoPDMS持久层根据持久层配置文件将内存域对象的数据写入到数据库，持久化AutoPDMS模型数据。
AutoPDMS程序运行时注册了域对象属性，利用反射机制读写域对象的各个属性数据。

\begin{center}
	\begin{figure}[!htbp]\scalebox{-0.5}{\rotatebox{180}{\includegraphics{appersistent.jpg}}}
		\caption{持久层的组成结构\label{appersistentstruc}}
	\end{figure}
\end{center}

\begin{center}
	\begin{figure}[!htbp]\scalebox{-0.5}{\rotatebox{180}{\includegraphics{appersistentmoduledep.jpg}}}
		\caption{持久层模块依赖\label{appersistentmoduledep}}
	\end{figure}
\end{center}

\subsection{持久层处理模块}
持久层域共享模块（APPersistentShare）：包括持久层域对象基类（Persistent）和一些常用的容器。
持久层域模块（APPersistentDomain）：持久层事务逻辑处理模块，包括读写数据库，映射持久层配置文件，处理数据域对象关系。

\subsection{持久层配置文件}
AutoPDMS持久层数据结构最初保存在持久层配置文件xml格式，扩展名为.cfg，后来重构了代码，保存在access数据库pdmscfg.mdb，这个数据库文件在AutoPDMS软件安装目录下的config子目录。

下面介绍配置文件和如何配置域对象关系。

\subsubsection{配置文件}
下面描述了持久层配置文件，这些描述也适用于pdmscfg.mdb数据结构。pdmscfg.mdb有6个表：cfg\_ClassMapper(525)、cfg\_Attribute(2705)、cfg\_Relation(760)、cfg\_Container(1)、cfg\_AttCategory(4)、cfg\_Attribute\_Hierarchy(2)，前3个表最重要。括号中的数字是该表目前的记录数。随着AutOPDMS软件的不断迭代重构，这些记录数随之改变。

持久层配置文件，最初格式为xml，例如，一个类的配置，以<classMapper>标签开头，</classMapper>结束。

一个类的配置，包含类名、表名、若干属性映射、关系映射和容器。

<classMapper>之后紧跟两行，描述类名和表名，这两行必须在其他行之前。

之后可以跟若干行BaseClass，表示本类继承其他类的属性（不会继承关系）。

属性映射：以attrib标签开头，attrib结束。包含5个字段。

AttributeName = Id;        域对象的属性名。与SetXXX()和GetXXX()函数的XXX相同。区分大小写。

ColumnName = id;        对应数据库字段的名字。大小写无关。当一个属性对应多个字段时（比如UeGePoint3d），依次写多个ColumnName。

ValueType = UeObjectId;        程序中的数据类型。

Save = TRUE;   是否保存到数据库中。值必须用全大写的TRUE或FALSE。当属性类型为指向另一个域对象的指针时，必须为FALSE。 例如SPEC节点，父节点为SPWL，SPEC域对象中Owner属性是指向SPWL的指针，字段保存该SPWL的ID。此时该字段的更新由关系负责，而不由该属性保存。

Key = TRUE;                数据库字段是否是索引。值必须用全大写的TRUE或FALSE。 

容器：以<container>标签开头，</ container >结束。当域对象内的容器对应单独的一张表时，需要用到容器的配置。

<container>

AttName = PTContainer;        域对象的容器名。区分大小写。

TableName = container;        对应的表名。

Colnums = pt\_x;                与属性映射中的ColumnName字段类似。本容器内的元素是UeGePoint3d，对应三个字段。

Colnums = pt\_y;

Colnums = pt\_Z;

ColID = id;                数据库中表中表示id的字段。

Sort = TRUE;                是否排序

ColSort = sort;                如果排序，则依照该字段的值排序。

ValueType = UeGePoint3d;        程序中的数据类型。

Mul = TRUE; 

ColContainerName = cname;        数据库表中，记录容器名的字段。

</container> 

关系映射：

以<relation>标签开头，</relation>结束。以便程序维护对象之间的关系（比如层次结构）。

RelationType = SMSuperClassRelation;        关系名。

关系有一对一和一对多两种。即一个主对象对应一个或者多个子对象；对应的子对象分为基类和最终类；每种关系又有对应的反关系，所以目前有8种关系。

关系比较复杂，详细描述在下面。

这里以SMSuper关系为例。

BaseTableName = BaseObject;        基表名。在这里，同时包含Ownerid和id的表，就是基表。

ColSub = id;                子表对应的字段。

ColOwner = ownerid;        基表对应的字段。

AttName = SMSuper;        主对象中，指向子对象的属性名。这里关系是一对多，主对象就是“一”。

ColSubClassName = subclassname;        基表中，保存子对象类名的字段名

ColOwnerClassName = ownerclassname;        基表中，保存主对象类名的字段名

Sort = TRUE;                排序

ColSort = sort;                排序字段

Status = ATUO\_DELETE|ATUO\_CREATE;        级联关系。

\subsubsection{关系配置}
关系有一对一（SS，Single－Single）和一对多（SM，Single－Multi）两种，即一个主对象对应一个或者多个子对象。

子对象分为基类（Super）和最终类（Specify）。

每种关系又有对应的反关系（在关系前加O）。所以目前共有8种关系。

每种关系的属性，在Relation.h和OReladtion.h都有注释。这里先解释其中几个名词。

基表：数据库中，维护父子节点关系、将ID和类名对应起来的表。它应该同时包含Ownerid和id。默认命名为PaternityMap。

包含父对象ID、子对象ID、父对象类名、子对象类名等几个字段。

参见\ref{templatedatabasedir}AutoPDMS软件安装目录/ project/ templatedatabase/ 数据库模版中的design.mdb。\ref{desigmdb}

主对象/子对象：例如一对多关系，“一”就是主对象，“多”是子对象。
   
一对多指定关系（SMSpecify）、一对多一般关系（SMSuper）、一对一指定关系（SSSpecify）、一对一 一般关系（SSSuper）都继承自关系（Relation，与ORelation相对），具有关系的公共属性。

RelationType = ;        //关系类型。 需要放在关系描述的第一行。

AttName = ;             //保存子对象的属性名（属于主对象的）。即主对象中，指向子对象的变量的名字。

Status = ;                //级联关系。当主对象改变时，子对象是否同时改变。 有ATUO\_DELETE、ATUO\_CREATE、ATUO\_UPDATA、AUTO\_ALL、AUTO\_NONE五种。前三种关系如果同时存在，可以用“|”隔开。ATUO\_DELETE|ATUO\_CREATE表示同步创建和删除。

Inverse = ;                //谁负责去维护关联关系。默认是FALSE，即主对象维护。

反关系（ORelation）与 四种关系（Relation）对应。反关系具有下列公共属性：

RelationType = ;        //关系类型。

Inverse = ;                //是否维护关联关系。

AttName = ;                //主对象的属性名。

一对多反关系OSMSpecify：

ColOwner;                //子对象表中，保存主对象ID的字段名

OwnerClassName;                //主对象的类名

OSMSuper：

BaseTableName;                //基表名

ColSub;                        //基表中，保存子对象ID的字段名

ColOwner;                //基表中，保存主对象ID的字段名

ColOwnerClassName;        //基表中，保存主对象类名的字段名

ColSubClassName;        //基表中，保存子对象类名的字段名

一对一指定关系（SSSpecify）

SubClassName;                //子对象的类名

ColSub;                        //主对象表中，保存子对象ID的字段名

一对一一般关系（SSSpuper）

ColSubClassName;        //参见SSSpectify

ColSub;                        //参见SSSpectify

一对一反关系

OSSSpecify

ColSub;                        //基表中，保存子对象ID的字段名

OwnerClassName;                //主对象的类名

OSSSuper：

ColSub;                        //基表中，保存子对象ID的字段名

OwnerClassName;                //主对象的类名

\subsection{AutoPDMS数据库}

AutoPDMS采用Access数据库，按工程存放数据，由Admin模块统一管理数据库。

存放模块节点数据的数据库包括各域节点表，还必须包括DBInfo表和PaternityMap表。

各节点表必须包括ID和Name字段。
	
\subsubsection{DBInfo表结构}
ID字段：默认0/0，World节点ID。

DBID字段：存放环境ID，可有多个。

MaxElementID：数据库中最大ID编号。

根据此表可以自动分配对象ID和确定对象存入的数据库。
	
\subsubsection{PaternityMap表结构}
ID：节点对象ID。

ParentID：父节点ID。

SubClassName：节点类名。

ParentClassName：父节点类名。

此表用来保存一对多一般关系节点数据。


\subsection{创建AutoPDMS域节点\label{adddomainnode}}
第一步：创建域节点类。

第二步：利用宏注册域对象属性。

第三步：实现相关域对象函数。

\subsubsection{第一步：创建域对象类}
选择合适的基类进行派生。

派生原则：
\begin{itemize}
	\item 所有要持久化的对象必须派生自Persistent类；
	
	\item 没有子节点的节点对象必须派生自UeLeafObject类；
	
	\item 有子节点的对象必须派生自UeTreeObject类；
\end{itemize} 

\begin{center}
	\begin{figure}[!htbp]\scalebox{-0.5}{\rotatebox{180}{\includegraphics{persistenthierarchy.jpg}}}
		\caption{持久层类派生层次\label{persistenthierarchy}}
	\end{figure}
\end{center}


\subsubsection{第二步：注册类属性}
注册属性原则：

域对象属性必须在类注册。

在域对象类，要实现设置属性和获得属性的函数，函数名称为Get+属性名和Set+属性名。

例如，如果注册的属性名为Name，则要在类写两个函数GetName()、SetName()。

注册属性方法：

利用以下宏进行注册。

类定义中：

REGISTER\_ATT\_DECLARE\_BEGIN( 类名 )

REGISTER\_ATT\_DECLARE(类名 , 属性类型, 属性名  ) 
.
.
REGISTER\_ATT\_DECLARE\_CONTAINER (类名 ,属性类型,属性名 )

类实现中：

REGISTER\_ATT\_IMP( 类名, 属性类型, 属性名  )
.
.
REGISTER\_ATT\_IMP\_CONTAINER (类名,属性类型,属性名 )

\subsubsection{第三步：实现相关成员函数}
对域节点根据不同情况要实现不同的函数。

根据需要实现以下函数，显示节点图形。

virtual void Draw ( GraphicSpace* pSpace ) = 0 ;

virtual void Project ( GraphicSpace* pSpace ) = 0 ;

virtual void Erase( GraphicSpace* pSpace ) = 0 ;

virtual void Highlight( GraphicSpace* pSpace , Color nColorIndex ) = 0 ;

virtual void HighlightEdge( GraphicSpace* pSpace , Color nColorIndex ) = 0 ;

virtual GMComponent* GetGm( ) = 0 ;


实现以下函数，复制节点：

virtual UeNodeObject* Clone( DEGREE::Degree eDegree = DEGREE::eLow ) ; 

virtual void CopyData( UeNodeObject* pSrcObj, DEGREE::Degree eDegree = DEGREE::eLow  );

需要实现函数，判断某节点是否是本节点的父节点：

virtual BOOL IsLegalParent ( UeNodeObject* pObj );

\section{微分方程数值解法}
为了更好地理解工程计算问题，我们补充一些数学知识。

使用数学方法，各种计算问题都可以转化为微分方程求解问题。

\subsection{微分方程及其解}

我们知道，可以使用微分方程计算自然界或人类社会的各种现象。微分方程包括常微分方程和偏微分方程。

凡含有参数，未知函数和未知函数导数的方程，称为微分方程。

未知函数是一元函数的微分方程称作常微分方程，未知函数是多元函数的微分方程称作偏微分方程。

包含一个自变量的函数方程式称为一元函数。例如y=F(x)。

包含2个以上自变量的函数方程式称为多元函数。例如u=f(x,y,z)。

任何一个系统（或模型）都是由各种变量构成的，当我们分析这些系统（或模型）时，可以选择研究其中一些变量对另一些变量的影响，那么我们选择的这些变量就称为自变量（Independent variable），而被影响的量就被称为因变量。

\begin{equation}
F(x,y,y',y^{n})=0
\end{equation}

为了求出微分方程的特解，需要规定微分方程的边界条件和初始条件。

如果方程要求未知量y(x)及其导数y′(x)在自变量的同一点x=x0取给定的值，即y(x0 )=y0，y′(x0)= y0′，则这种条件就称为初始条件，由方程和初始条件构成的问题就称为初值问题；

而在许多实际问题中，往往要求微分方程的解在某个给定区间a ≤ x ≤b的端点满足一定的条件，如y(a) = A , y(b) = B，则给出的在端点(边界点)的值的条件，称为边界条件，微分方程和边界条件构成数学模型就称为边值问题。

边值问题中的边界条件的形式多种多样，在端点处大体上可以写成这样的形式，Ay+By'=C，若B=0，A≠0,则称为第一类边界条件或狄里克莱(Dirichlet)条件；B≠0,A=0，称为第二类边界条件或诺依曼(Neumann)条件；A≠0,B≠0，则称为第三类边界条件或洛平(Robin)条件。

总体来说，
第一类边界条件：
给出未知函数在边界上的数值；

第二类边界条件：
给出未知函数在边界外法线的方向导数；

第三类边界条件：
给出未知函数在边界上的函数值和外法线的方向导数的线性组合。

对于特殊的微分方程，可以求出它的解析解。解析解，是指用符号表示的解，一般是包含分式、三角函数、指数、对数甚至无限级数等基本函数形式的解。

对于不存在解析解的微分方程，只能采用数值计算方法，例如有限元方法、有限差分法，等等，求得近似的数值解(numerical solution)。

数值解法是工程技术中普遍采用的方法。

AutoPDMS目前采用有限元方法作为数值求解器。未来也可能增加新的数值求解器，如LBM、从头算方法，等等。

\subsection{有限元方法 FEM}
1960年Clough在处理平面弹性问题，第一次提出并使用“有限元方法”(finite element method)的名称;

有限单元法，即有限元法，是一种求解数学问题的方法。基本思想是把计算域划分为有限个互不重叠的单元，在每个单元内，选择一些合适的节点作为求解函数的插值点，将微分方程中的变量改写成由各变量或其导数的节点值与所选用的插值函数组成的线性表达式，借助于变分原理或加权余量法，将微分方程离散求解。采用不同的权函数和插值函数形式，便构成不同的有限元方法。有限元方法最早应用于结构力学，后来随着计算技术的发展也用于流体力学、电磁学、多物理场的数值模拟。

在有限元方法中，把计算域离散剖分为有限个互不重叠且相互连接的单元，在每个单元内选择基函数，用单元基函数的线形组合来逼近单元中的真实解，整个计算域上总体的基函数可以看为由每个单元基函数组成的，则整个计算域内的解可以看作是由所有单元上的近似解构成。在河道数值模拟中，常见的有限元计算方法是由变分法和加权余量法发展而来的里兹法和伽辽金法、最小二乘法等。根据所采用的权函数和插值函数的不同，有限元方法也分为多种计算格式。从权函数的选择来说，有配置法、矩量法、最小二乘法和伽辽金法，从计算单元网格的形状来划分，有三角形网格、四边形网格和多边形 网格，从插值函数的精度来划分，又分为线性插值函数和高次插值函数等。不同的组合构成不同的有限元计算格式。对于权函数，伽辽金(Galerkin)法是将权函数取为逼近函数中的基函数 ；最小二乘法是令权函数等于余量本身，而内积的极小值则为对代求系数的平方误差最小；在配置法中，先在计算域 内选取N个配置点 。令近似解在选定的N个配置点上严格满足微分方程，即在配置点上令方程余量为0。插值函数一般由不同次幂的多项式组成，但也有采用三角函数或指数函数组成的乘积表示，但最常用的是多项式插值函数。有限元插值函数分为两大类，一类只要求插值多项式本身在插值点取已知值，称为拉格朗日(Lagrange)多项式插值；另一种不仅要求插值多项式本身，还要求它的导数值在插值点取已知值，称为哈密特(Hermite)多项式插值。单元坐标有笛卡尔直角坐标系和无因次自然坐标，有对称和不对称等。常采用的无因次坐标是一种局部坐标系，它的定义取决于单元的几何形状，一维看作长度比，二维看作面积比，三维看作体积比。在二维有限元中，三角形单元应用的最早，近来四边形等参元的应用也越来越广。对于二维三角形和四边形电源单元，常采用的插值函数为有Lagrange插值直角坐标系中的线性插值函数及二阶或更高阶插值函数、面积坐标系中的线性插值函数、二阶或更高阶插值函数等。

有限元方法解题步骤如下。

\subsubsection{建立积分方程}
根据变分原理或方程余量与权函数正交化原理，建立与微分方程初边值问题等价的积分表达式，这是有限元法的出发点。

\subsubsection{区域单元剖分}
根据求解区域的形状及实际问题的物理特点，将区域剖分为若干相互连接、不重叠的单元。区域单元(即网格)划分是采用有限元方法必需的前处理步骤，这部分工作量比较大，除了给计算单元和节点进行编号和确定相互之间的关系之外，还要表示节点的位置坐标，同时还需要列出自然边界和本质边界的节点序号和相应的边界值。现在已经有很多开源的区域单元划分软件，可以自动划分网格。

\subsubsection{确定单元基函数}
根据单元中节点数目及对近似解精度的要求，选择满足一定插值条件的插值函数作为单元基函数。有限元方法中的基函数是在单元中选取的，由于各单元具有规则的几何形状，在选取基函数时可遵循一定的法则。

\subsubsection{单元分析}
将各个单元中的求解函数用单元基函数的线性组合表达式进行逼近；再将近似函数代入积分方程，并对单元区域进行积分，可获得含有待定系数(即单元中各节点的参数值)的代数方程组，称为单元有限元方程。

\subsubsection{总体合成}
在得出单元有限元方程之后，将区域中所有单元有限元方程按一定法则进行累加，形成总体有限元方程。

\subsubsection{边界条件的处理}
一般边界条件有三种形式，分为本质边界条件(狄里克雷边界条件)、自然边界条件(黎曼边界条件)、混合边界条件(柯西边界条件)。对于自然边界条件，一般在积分表达式中可自动得到满足。对于本质边界条件和混合边界条件，需按一定法则对总体有限元方程进行修正满足。

\subsubsection{解有限元方程}
根据边界条件修正的总体有限元方程组，是含所有待定未知量的封闭方程组，采用适当的数值计算方法求解，可求得各节点的函数值。

\subsection{离散元方法 DEM}
1971年Cundall提出此方法时采用distinct element method是为了和连续介质力学中的finite element method相区别。后来用discrete element method取代了distinct element method，以反映系统是离散的这一本质特征。

1971年Cundall提出适于岩石力学的离散元法， 1979年Cundall和Strack又提出适于土力学的离散元法，并推出二维圆盘(disc)程序BALL和三维圆球程序TRUBAL(后发展成商业软件PFC-2D/3D)，形成较系统的模型与方法，被称为软颗粒模型；

离散元与分子动力学的比较

从本质上来讲，离散元和分子动力学方法类似（molecular dynamics)，以至于有些作者在文献中不加区别的使用MD和DEM两个名字。然而离散元和分子动力学相似性只体现在形式上的相似（颗粒和牛顿定理）。二者还是有很大差别，在于分子动力学计算原子如何在给定相互作用势下如何运动，而离散元计算的颗粒通常为微米及毫米量级。此外，离散元方法中需要考虑颗粒体在外力作用下的旋转运动，颗粒的形状，颗粒尺寸分布，以及颗粒之间填充气体，液体对颗粒材料宏观性能都有很大的影响。总之，即使计算模拟一个最简单的颗粒系统，单一尺寸的球形颗粒考虑摩擦作用下的运动问题都涉及到许多需要仔细考虑的细节，然而正如其他模拟方法一样，这些细节往往不会被作者在文章中出版，大多靠自己在实践中去不断领悟。

\subsubsection{计算流程}
第一步：建立所需要的几何模型并产生颗粒

几何模型可以根据实际计算模型需要建立，颗粒产生通常为随机产生，及在给定的几何空间内随机产生所需要的颗粒。产生颗粒时需要实时监测新产生的颗粒和已有颗粒之间的位置关系，任意两颗粒之间不能有重叠，否则颗粒之间相互作用力可能很大而导致系统崩溃。所以如果几何模型尺寸，颗粒尺寸以及颗粒数目之间关系不合适，有可能导致颗粒产生失败。颗粒的初始速度需要根据模拟需要而给定。

第二步：接触探测

计算颗粒之间的相互距离，如果颗粒之间存在相互接触（颗粒之间的距离小于两个颗粒之间的半径和），则要采用接触模型计算相互作用力。

第三步：确定接触模型

接触模型是离散元计算的核心。所谓接触模型就是确定颗粒接触时的相互作用力。离散元计算中首先把相互作用力分解为法向力和切向力（法向指的是两接触颗粒中心之间的连线），所以接触模型一般包含法向相互作用和切向相互作用。

在目前的离散元计算模拟中，一般来讲，可以把所涉及到的接触模型分为两大类：

1） 非结合性接触力模型。此种接触模型不考虑颗粒之间的相互吸引力，颗粒之间的相互作用以弹簧-粘壶模型来近似。弹簧代表颗粒之间的弹性相互作用，粘壶代表颗粒之间由于碰撞而引起的能量耗散。切向相互作用还要考利库仑最大摩擦力约束。

2）结合性接触力模型。微观上来讲，任何颗粒材料都由原子分子构成，然后原子分子之间存在van der Waals相互吸引力。当颗粒尺寸比较大时，van der Waals相互吸引力和颗粒自身重力相比较而言，对颗粒本身运动的影响可以忽略不计；然后，随着颗粒尺寸减小，颗粒之间的相互吸引力变的和重力相当；当颗粒尺寸进一步减小时，颗粒之间相互吸引力要远远大于颗粒自身的重力。此时，就必须要考虑颗粒之间的相互吸引力。

目前来讲，为了描述颗粒之间的相互引力作用力，有以下几个模型可以选择：

A. Johnson-Kendall-Roberts(JKR) 模型

JKR模型首先是基于能量平衡原理，从赫兹的非结合性接触力模型而建立的。在JKR 模型中，颗粒之间的相互吸引力用表面能代表。并且颗粒之间的相互吸引作用只存在于接触面积之类，不考虑颗粒之间其他部分的吸引相互作用。因此，JKR模型对大的，比较软的颗粒材料描述比较好。

B, Derjaguin-Muller-Toporov(DMT)模型

DMT模型建设两个颗粒之间的接触变形和赫兹模型相同，但在接触面积之外，存在一个额外的相互吸引作用力。DMT模型对小的比较硬的颗粒材料描述比较好。
早期，当JKR和DMT模型被提出时，人们争论哪一个模型是正确的，后来研究发现，两个模型都正确，他们考虑的颗粒之间接触的两个极端情况，基于材料性质，应该有区别的加以选取。1977年，人们提出Tabor 系数作为选取依据，Tabor系数是表面能，等效模量等材料性质的函数。JKR模型对大的Tabor系数适用，而DMT模型则反之。

C. van der Walls模型

此模型是基于颗粒之间的van der Walls相互作用直接推导得出。van der Waals相互作用能可以知道，然后对距离求导就直接得到力的表达式。

第四步：考虑其他相互作用力

有时，在颗粒系统中，取决于外部条件，需要考虑其他类型的相互作用力。例如，如果环境比较潮湿，则需要考虑颗粒之间的液桥相互作用力；如果颗粒表面本身带有电荷，则要引入颗粒之间的静电相互作用；如果有外加磁场并且颗粒材料本身有磁矩，则要考虑外磁场引起的磁性力。所有这些类型的相互作用力，都可以嵌入在离散元模型之中。

第五步：考虑颗粒和边界之间的相互作用

计算模型的边界可以是全部周期性边界条件（x,y,z方向，全部采用周期性边界），也可以是部分周期性边界。在非周期性边界条件时，则要给出颗粒本身和边界之间如何相互作用。接触模型和颗粒之间相互作用的接触模型类似。

第六步：计算总的受力、加速度

综合颗粒之间的相互作用力以及其他需要考虑的特殊相互作用力、以及颗粒与边界之间的相互作用力，可以得到颗粒本身受的合外力，以此可以求得加速度

第七步：更新颗粒速度，坐标

根据加速度，更新颗粒速度，角速度，坐标等变量。坐标更新后，再进行接触探测，整个计算流程进入下一个循环。

第八步：保存数据

第九步：分析处理

\subsubsection{编码思想}
离散元方法的编码思想十分简单。集合中每一个单元都是独立的，每个单元都具有相应的尺寸、质量、转动惯量和接触参数等属性。它以牛顿第二定律和力一位移定理为基础，对每一个单元首先确定与之接触的单元，根据单元之间的重叠量，运用力一位移定理计算单元之间的接触力，从而得到单元的合力和合力矩，之后用牛顿第二定律确定单元的运动规律，如此循环计算，直到系统中所有颗粒都计算完毕。

\subsection{分子动力学方法 MD}
分子动力学方法是一种计算机模拟实验方法，是研究凝聚态系统的有力工具。该技术不仅可以得到原子的运动轨迹，还可以观察到原子运动过程中各种微观细节。它是对理论计算和实验的有力补充。广泛应用于材料科学、生物物理和药物设计等。

经典MD模拟，其系统规模在一般的计算机上也可达到数万个原子，模拟时间为纳秒量级。

2006年进行了三千二百亿个原子的模拟（IBM BlueGene/L）。 

\subsubsection{原理}
分子动力学总是假定原子的运动服从经典的牛顿力学定律。

根据牛顿定律建立一组分子的运动方程，然后对系统中的每一个原子/分子运动方程进行数值求解，得到每个时刻每个原子/分子的坐标与动量(速度)，即在相空间的运动轨迹，再利用统计方法得到多体系统的静态和动态特性，从而得到系统的宏观性质\ref{mdoutput}。

\begin{figure}
	\epsfig{file=mdoutput.jpg,width=12cm}
	\caption{MD方法信息输入输出信息方框图\label{mdoutput}}
\end{figure}

\subsubsection{简史 \label{mdhistory}}
年代	创立者								创造内容工作（MD分类名称）
1957	B. J Alder \& 
T. E. Wainwright	刚性球MD方法
1963	A. Rahman						质点系MD方法
1971	Rahman \&
F. H. Stillinger		刚性系统MD方法
1972	W. Lees \&
S. F. Edwards			平衡系统MD方法（存在速度梯度）
1977	J. P. Rychaert et al.			约束系统MD方法
1980	Andersen, Parrinello \& Rahman	恒压MD方法
1983	N. J. Gillan \&
M. Dixon			非平衡MD方法（存在温度梯度）
1984	 S. Nosé						恒温MD方法
1985	R. Car \&
M. Parrinello			第一性原理MD方法
(Car-Parrinello方法)
1991	Cagin \& Pettitt					巨正则系统MD方法

\subsubsection{方程}
对于基本单元内的原子、分子运动方程，使用什么样的形式合适，要具体问题具体分析。若是考虑具有确定的粒子数N，体积V和能量E的NEV系综(称为微正则系综，Micro-Canonical Ensemble)，则其运动方程可以表达成式\ref{newton2ndlaw}所示的普通牛顿方程的形式

\begin{equation}
\label {newton2ndlaw}
m_{i} \frac{d {\vec{r_i}}^2}{d {t^2}}=\overrightarrow{F_i}
\end{equation}

式中$m_{i}$为所考察的原子i质量，$\vec{r_i}$为原子的位置坐标，$\vec{F}_{i}$为作用在原子i上的原子相互作用的合力，它由下式给出

\begin{equation}
\label {force}
{\vec F_i}=-\nabla_i \sum_{j=1}^n\Phi_{ij} 
\end{equation}

\subsubsection{MD软件选择}

考虑1：软件的选择，这通常和软件主流使用的力场有关，而软件本身就具体一定的偏向性，比如说，做蛋白体系，Gromacs，Amber，Namd均可；做DNA, RNA体系，首选肯定是Amber；做界面体系，Dl\_POLY比较强大，另外做材料体系，Lammps会是一个不错的选择
考虑2：力场的选择。力场是来描述体系中最小单元间的相互作用的，是用量化等方法计算拟合后生成的经验式，有人会嫌它粗糙，但是它确确实实给我们模拟大系统提供了可能，只能说关注的切入点不同罢了。常见的有三类力场：全原子力场，联合力场，粗粒化力场；当然还有所谓第一代，第二代，第三代力场的说法，这里就不一一列举了。

\subsection{格子玻尔兹曼方法 LBM}

1872年，路德维希·玻尔兹曼（Ludwig Edward Boltzmann，1844年2月20日—1906年9月5日）建立了玻尔兹曼方程（又称输运方程）。

Lattice Boltzmann(LB)方法是求解玻尔兹曼方程的一种数值方法，是1980年代中期建立和发展起来的一种流场模拟方法，它继承了格子气自动机(LatticeGasAutomaton，LGA)的主要原理并对LGA作了改进。

与传统的计算流体力学方法(如有限单元法、有限差分法等)相比，格子Boltzmann方法主要有以下优点:
(1)算法简单，简单的线性运算加上一个松弛过程，就能模拟各种复杂的非线性宏观现象;
(2)能够处理复杂的边界条件:
(3)格子Boltzmann方法中的压力可由状态方程直接求解;
(4)编程容易，计算的前后处理也非常简单;
(5)具有很高的并行性;
(6)能直接模拟有复杂几何边界的诸如多孔介质等连通域流场，无须作计算网格的转换。

LBM作为一项具有显著优势的流体计算方法，已被广泛用于理论研究和处理工程问题。由于其边界易于设置的特点，使得LBM易于处理较为复杂与不规则的结构，因而适用于解决多孔介质内的流动与传质问题；由于模型具备描述粒子运动的特性，使得其在处理流体与固体作用相对直观，在解决气-固和流-固耦合方面具备优势；LBM在处理多相多组分流体问题时相比于传统计算流体方法在抓取移动和变形的界面、描述组分间相互作用方面具备明显优势，通过基于对不同组分作用的描述，形成了各类多相多组分LBM模型，例如颜色模型（Color-gradient model）、伪势能模型（pseudo-potential model）、自由能模型（free-energy model）、相场模型（phase-field model）等。这些模型被广泛地运用在多组分、多相流、界面动力学、化学反应与传递等领域。除此之外，LBM在磁流体、晶体生成、相变过程等方面也具备潜在的应用前景。
\section{Boundary Representation BREP}\label{brep}

\subsection{ObjectARX BREP}\label{arxbrep}
The AcBr class hierarchy is a subset of the ObjectARX® class hierarchy, and defines the following classes:\ref{acbr}

\begin{figure}
	\begin{minipage}[htbp]{0.35\linewidth}
		\epsfig{file=acbr.jpg,height=8cm}
		\caption{AcBr class hierarchy \label{acbr}}
	\end{minipage}
	
\end{figure}
\subsubsection{ObjectARX BREP domain}
AutoCAD solids are boundary representations (often referred to as B-rep models), consisting of a collection of topological connectivity objects and associated geometric boundary objects. The topological objects are defined in the AcBr library and are described later in this section, whereas the geometric objects are defined in the AcGe library.

Objects defined or generated by the AcBr library reside in three-dimensional Euclidean model space (E3). The only exceptions are geometric objects defined in the two-dimensional parameter space of a surface (such as parameter curves and parameter points).

In general, only the 2-manifold topological domain is supported by the AcBr library. Singularities (which are geometric degeneracies) are supported in order to represent the apex of a cone, but wire bodies and mixed dimensionality solids (which may include dangling wires and faces) are not supported; nor can they be realized in AutoCAD.

The general nonmanifold domain is a superset of the 2-manifold domain, and allows distinct solid volumes to touch at single points, curves, or faces; and allows any combination of wireframe, sheet, and solid objects. The following nonmanifold objects are supported by AutoCAD and the AcBr library:

Two 2-manifold solids united along a shared edge or vertex
An AcDbBody object containing a single face
A topological object may be unbounded (that is, it may have no lower dimensional bounding topology) only in the following cases:

A closed surface, which is intrinsically bounded in both the u and v directions (such as a full torus or sphere), is represented by a face that has no loop boundaries.
A closed curve, which is intrinsically bounded (such as a full circle or ellipse), is represented by an edge that has coincident start and end vertices.

\section{CAE域对象}
任何应用程序都有变量和函数。这些变量属于数据结构的一部分，是函数或程序间交换数据的基础。在C语言中这些变量被称为数据结构，在C++或java等语言中，或者在软件设计中，这些变量被称为域对象。域对象是内存与持久存储之间交换数据的基本机制，是任何软件必不可少的基本组件。

域对象是所有应用程序的中枢。在数据库应用中，域对象捕捉了数据库的核心数据模型和应用在数据上的业务规则。在典型情况下，应用程序的大多数子系统都依赖这些通用的域对象--这意味着域对象的映射越接近数据库大纲，应用程序研发者理解和使用它们就越容易，因为它们表现了数据库中的现实"实体"和"关系"。

如果域对象没有和应用程序的其它部分分开，你通常就得把持久层代码复制到非常多的位置。同样，如果域对象没有和持久层代码分开，你遇见的情况就是，所有使用域对象的子系统都必须知道并依赖持久层对象。对持久层对象的所有更改都必然影响整个应用程序。因此，如果没有把域对象和应用程序和持久层代码分开都是不好的设计。

在持久层章节，介绍了AutoPDMS持久层基本原理和添加域节点的方法。下面我们实例分析如何添加AutoPDMS CAE域对象。

\subsection{添加域对象}
详见\ref{adddomainnode}。

\subsection{有限元方法基本域对象}
有限元方法FEM基本域对象包括节点nodes、单元elements、网格mesh等。

几何实体可以按精度要求，划分为网格mesh，网格包含许多互相连接、互不重叠的单元elements，单元按不同类型含有各种数目的节点nodes。

\subsection{Nodes 节点域对象}
Nodes即节点，是有限元方法的基本对象，在ccx中，它被表示在readfrd.h：

typedef struct {
	int   nr;              /*   external node-nr (node[node-indx].nr) */
	int   indx;            /*   node-index (node[ext-node-nr].indx)   */
	char  pflag;           /*   1 if used for display purposes    */
	/*  -1 if the node is deleted          */
	/*   0 default                         */
	double nx;             /*   coordinates  node[ext-node-nr].nx */
	double ny;
	double nz;
} Nodes;

\subsection{Elements 单元域对象}
Elements即单元，是有限元方法的基本对象，在ccx中，它被表示在readfrd.h：

typedef struct {
	int nr;                /* external element-nr */
	//  int indx;              /* -index (elem[external elem-nr].indx)   */
	int type;              /* element type (1:Hexa8)  */
	int group;
	int mat;
	int attr;              /* -1: unstructured mesh tr3u (-2 for mesh with libGLu tr3g ) */
	/*  0: default           */
	/*  1: reduced integration he8r he20r */
	/*  2: incompatible modes he8i */
	/*  3: DASHPOTA be2d */
	/*  4: plane strain (CPE) tr3e tr6e qu4e qu8e */
	/*  5: plane stress (CPS) tr3s */
	/*  6: axisymmetric  (CAX) tr3c */
	/*  7: fluid he8f */
	/*  8: tet10m */
	int nod[27];
	double **side;         /* side[Nr.][x|y|z]== normal vector */
} Elements;

对于3节点网络单元或3节点梁单元，可以建立3节点网络单元或3节点梁单元元件库来模拟管网或梁柱，3节点单元元件的流入流出点分别对应网络单元或梁单元的2个端节点，为网络或梁单元元件增加1个中间节点Ppoint，Pnumber可作为节点编号。这样可以利用AutoPDMS CAD现有显示代码，显示网络单元或梁单元。
对于CAE三维单元，建立三维单元元件库，可能并不能解决问题，因为可能要在三维实体几何模型填充各种不同形状不同数量的CAE三维单元，来满足求解精度。

\subsection{mesh 网格域对象}
mesh即网格，是有限元方法的基本对象，在ccx的readfrd.h，没有专门的数据结构表示mesh。

AutoPDMS CAD几何模型被分成各种数量各种形状的单元，这叫做区域网格(mesh)划分。

可以使用开源网格划分代码，划分几何模型。

如何显示网格几何模型，需要深入研究。

\subsection{Datasets 单元域对象}
Datasets即数据集，是有限元方法的基本对象，在ccx中，它被表示在readfrd.h：

typedef struct {
	char  **pheader;    /* project header */
	int   npheader;              /* number of headers */
	char  **compName;
	char  **icname;
	char  name[MAX\_LINE\_LENGTH];
	char  dataset\_name[MAX\_LINE\_LENGTH];
	char  dataset\_text[MAX\_LINE\_LENGTH];
	char  analysis\_name[MAX\_LINE\_LENGTH];
	float value;
	char  filename[MAX\_LINE\_LENGTH];
	FILE *handle;
	fpos\_t *fileptr;
	int   loaded;       /* if data are stored:1 else: 0 */
	int format\_flag;
	int analysis\_type;
	int step\_number;
	int ncomps;
	int irtype;
	int *menu;
	int *ictype;
	int *icind1;
	int *icind2;
	int *iexist;
	float **dat;        /* node related data */
	float ***edat;      /* element related data */
	float *max;         /* maximum datum */
	float *min;         /* minimum datum */
	int *nmax;          /* node with maximum datum */
	int *nmin;          /* node with minimum datum */
} Datasets;

AutoPDMS CAE域对象最重要的节点之一，用于规定所求解微分方程的计算结果。

\subsection{BOUNDARY 域对象}
BOUNDARY即边界条件，是AutoPDMS CAE域对象最重要的节点之一，用于规定所求解微分方程的边界条件。

边界条件只能规定在节点或单元的面。

\section{显示}
AutoPDMS显示框架允许配置各种显示驱动程序，即具备跨图形平台的潜在能力。不过，在开发之初，为了加快开发进度，降低开发成本，利用了AutoCAD的显示驱动。因此，目前AutoPDMS的显示驱动和图形操作是基于AutoCAD和ObjectARX的。

\subsection{显示框架}

\subsection{显示驱动}
AutoPDMS使用ObjectARX接口到AutoCAD显示驱动。

\section{多用户管理Admin \label{usersadmin}}
\subsection{概述 }
AutoPDMS允许多个用户同时设计一个项目，这需要对各个用户进行权限控制以及对项目的设计、出图等模块进行配置，以避免读写数据时发生冲突。这些功能由管理模块Admin实现：

	管理本项目用户和用户组。

	管理本项目数据库和数据库组。

	创建新的AutoPDMS项目。

	导入一个存在并且完好的外部项目。



用户:一个用户可以被多个用户组包含

用户组:包含一个或多个用户

数据库:一个数据库对应一个用户组，对应用户组下的成员有修改此数据库的权限

数据库组:包含一个或多个数据库，登录此数据库组创建的根节点将保存到节点所属模块对应的第一个数据库中，模块和数据库类型的对应关系参见\ref{moduledbrelation}。


用户、用户组、数据库、数据库组关系图参见\ref{userteamrelation}。

\begin{figure}
	\epsfig{file=usersadmin.jpg,width=12cm}
	\caption{用户、用户组、数据库、数据库组关系 \label{userteamrelation}}
\end{figure}

\begin{figure}
	\epsfig{file=moduledbrelation.jpg,width=12cm}
	\caption{模块和数据库类型的对应关系 \label{moduledbrelation}}
\end{figure}

\begin{figure}
	\epsfig{file=dbgroup.jpg,width=12cm}
	\caption{建立数据库组 \label{dbgroup}}
\end{figure}

\begin{figure}
	\epsfig{file=adminelement.jpg,width=12cm}
	\caption{管理各种元素 \label{adminelement}}
\end{figure}

\subsection{权限设置}
一个项目包含了很多数据库，这些数据库一般包括设计库、元件库、属性库、二维图库等，比如我们建的模型一般就存入了设计库，出的平面图存储在二维图库。一个数据库只能在一个给定的项目中被创建，如果其它项目需要用到这个数据库，就必须采用引用的方式。

如果项目比较庞大，通常参与的人数会很多，这时，就需要对各位设计人员的权限进行控制，对某些特定用户来讲，部分数据库是可以读写的，部分数据库却只有读的权限而不能修改，还有一些数据库不能被读写，为了方便管理，就将用户划分为不同的用户组，再由这些用户组创建数据库。这些用户组创建的数据库构成了一个数据库组，对于同一个数据库组的用户来讲，相互间至少具有读的权限，对于由用户对应的用户组直接创建的数据库来讲还具有写的权限。而对其他数据库组就没有任何权限了。这里的用户通常是指操作员权限用户。 
权限最大的自然是超级管理员，超级管理者可以进入任何项目的任何数据库组进行读或写，软件默认超级管理员为SYSTEM,密码为六个大写的X字母：XXXXXX。
以上功能在管理模块实现。参见图\ref{dbgroup}。

可以看到系统已经进入了管理模块，新建了一个数据库组DESIGN。\ref{adminelement}

左边一列管理元素，目前能够使用的只有用户组、用户、数据库、数据库组。这四个元素也是最重要的。右边的方框显示了有哪些当前选择元素在该项目中。
通常用户组相当于专业组，用户属于各个专业组，数据库相当于各个专业组的设计数据，一般每个专业组都有自己的数据库，而且，只有本专业组的用户对属于本组的数据库才有更改的权限。一个专业组的用户想要看到其他专业组的设计数据，就要用到数据库组。数据库组是把相关专业的设计数据库组合在一起。对其他专业的数据库只有读权限，没有写权限。

权限管理的详细使用说明参见\cite{apdoc}第5章管理模块。 

\section{元件库}
元件库的节点层次

一个完整的元件库的需要五个并列的管理层次： 

-Spec-world（SPWL）            等级库 

-Coco Tables (CCTA)              元件连接表 

- Catalogue（CATA）             管道元件库 

-Bolt Tables (BLTA)               螺栓表 

-UNITS                         单位库 

下图中，WORLD是当前数据库的最高层，与DESIGN中的WORLD不是同一个。 管道元件库（CATA）的管理数据层次如下图： SECT及CATE用于区分不同类型的数据，SECTION层次是必需的，Categories则是选项。 

管道元件的数据库层次(Hierarchy)如图\ref{paragonhierarchy}。

\begin{figure}
	\epsfig{file=paragonhierarchy.jpg,width=12cm}
	\caption{元件库节点层次\label{paragonhierarchy}}
\end{figure}

\subsection{CCTA}
连接匹配表的管理节点。

\subsection{COCO}
保存了连接匹配信息的节点，在管道设计中，系统检查两个元件是否可以连接，就是检查此节点是否有需要的连接匹配信息。
它的主要属性：
Name：推荐命名为 连接类型名+连接类型名。
Ctype（连接类型）：存储了两种连接类型是否可以连接，比如：GRS FRS。

\subsection{CATA}

CATA是元件库的最高层，它主要包含Catalogue Sections，它也可以包含文本节点（TEXT）。

它的主要属性有：

Purpose：指明元件的用途，比如用于管道它值为PIPE，用于暖通空调的它值为HVDE用于钢结构的它值为JION、FITT，用于支吊架的它值为HSUP。）

Cstandard：元件标准（如：ANSI）  

[注]：与等级关联的元件必须在一个CATA目录下，而在CATA目录下的元件不一定都和等级关联。

\subsection{SECT}

SECT对所有元件进行分门别类管理，如：BEND、NOZZLE、ELBOW等，它是CATA的子节点，并且是必须的。
它的主要属性有：
PurPose：是指该SECT层下的元件的用途,它的值通常是取Gtype（用于区分管道元件类型）所定义的值
Gtype：元件类型（如：BEND、ELBOW，VALVE等），但PIPE元件库中，大多数SECT层没有设置该参数，而是在CATE层设置该参数。

\subsection{CATE}

CATE是对属于同一类而有不同小类的元件进行管理的层。它是可选的（即如果一种元件只有一种类型，则可以没有该层，直接让子层继承SECT）。创建CATE节点的界面也可同步创建点集、型集、元件需要用到的各类参数。

它的主要属性：

Purpose：在CATE层下，它的取值应该是取Stype（管道元件的小类型，用于进一步细分元件，比如GATE用于表示VALV（阀门）中的闸阀）所定义的值。 

Gtype：元件类型。

Skey：唯一标示一个元件在ISO图中的形状，主要用于出ISO图。      

Ptref：点集的引用（指向PTSE）。

Gmref：型集的引用（指向GMSE）。

Dtref：数据集引用（指向DTSE）。

Cdetail：细节文本的引用（指向SDTE）。

\subsection{DTSE}

数据集节点，用于保存元件参数对应的有特殊用途的数据，比如：弯头中可以用来表示哪一个参数代表外径。

\subsection{SDTE}

用于描述元件的几何形状和特征，在生成等级，生成材料报表，isodraft 材料单都有应用。 

它的主要属性：

Rtext：详细描述(Isodraft)，建议按以下关键字定义详细描述:

Name=名称,A=角度,C=代号码,RD=半径位数,S=系列,RF=密封面,Sch=表号,PN=压力,T=温度,SN=标准号或技术规范,DimN=尺寸规范号,MatN=材质规范号,CatN=图号,CO=端口连接类型(部分阀门保留了)

如: Name =无缝钢管,DimN= GB5310-2008,CN= P32C13SO,PN=PN32MPa,T=185℃

Stext：用法和Rtext一致，不过一般用来写入参数化描述文字。

参数化描述文字 : 

元件描述和材料描述都可以自动提取元件的参数。在命令行中输入下列表达式 

（注意：表达式中运算符号前后要加空格）： 

STEXT (‘无缝弯头 R=1.5DN 90°φ’ + STR (PARAM[4]) + ‘X’ + STR(PARAM[6])) 

最终料单中出现的描述是： 无缝弯头 R=1.5DN 90°φ114X4 

在DESIGN和ISODRAFT中键入Q DTXS可以看到表达式的结果。

符号关键字：由元件类型和元件描述决定。

\subsection{TEXT}

用来表示元件参数名字的节点，比如给第一个参数取名为直径等。
它的主要属性有：
Name：节点名称，必须命名为CATE的名字+“-PA”+ 第几个参数（阿拉伯数字）
Stext：给参数起的别名

\subsection{PTSE}

点集节点，用于表明元件上的连接点以及元件图形上的管件点的位置。

点集是一类管件(包括管嘴)关键点(P-point)的集合，每个关键点 (P-point)都包含详细的信息：直径、连接形式、相对管件原点的位置、相对管件原点的方向等等。所以通过点集就可以表达管件除了形状外的完整信息。关键点(P-point)在三维坐标系中定义，每个点都有方向。 在DESIGN，DRAFT中都要用到P-point。 点集可以被不同直径的一类管件或几类管件共用，这意味着关键点(P-point) 相对管件原点的位置必须是可变的，就需要用到参数。 有三类P-point元素可以使用，PTAXI，PTCAR，PTMIX。使用哪一种要看关键点相对于管件原点的位置和方向。

PTAXI  轴坐标点，只需要定义一个轴方向及一个沿轴的距离。 

PTCAR 笛卡尔坐标点，（极坐标）。需要定义角度及点坐标。用于定义与轴有角度的空间一点。 

PTMIX  混合坐标点，是前面两种方法的组合。需要定义一个轴方向及精确的点坐标。轴方向可以与轴平行或在轴平面中。

点集中的每个点可以用上面任意一种方法生成。 



\subsection{GMSE}

型集节点，用于描述具体元件的图形。

元件的型集是一个基本体的集合。建立型集的过程就像设备建模一样，用基本体搭出元件的外形。同样也要定义Level 和Obstruction 值。型集的建立要依赖点集，点集就像人的骨架，型集是附在骨架上的肌肉。型集只在建模中用到，而“不可见”的点集在很多模块中都要用到。在生成型集之前，我们必须决定元件在模型中表现出来的样子。包括实体模式和单线模式。两种表现形式用两个标记（flags）区分, 实体模式TUFLA，单线模式CLFLA。

\subsection{SCOM}

元件节点，用于保存元件的数据。它位于CATE下，也可以直接位于SECT下。元件节点表示一个具有详细尺寸参数的管道元件，例如PN=225的弯头。除了保存元件数据外，还可以用来保存保温厚度数据，用来创建保温等级。

它的主要属性有：

Gtype：元件类型。

Ptref：点集引用。

Gmref：型集引用。

Dtref：数据集引用。

Blrfarray：螺栓螺母的引用。

Param：元件的一些参数。

\subsection{DTAB}

存储不同直径的螺栓标准长度的节点，每个直径的螺栓对应一个DTAB节点。

主要属性：

Blength：存储标准长度，如M20的螺栓标准长度有100 110 120 130 140 150。

此属性值应该填写为100 110 120 130 140 150。

\subsection{SBOL}

表示一个具体的螺栓，此节点引用了相对应直径的DTAB节点，根据螺栓的类型（单头螺栓、双头螺柱等）不同存放了附件（螺母、垫圈）的个数。

主要属性：

Nstdblength：引用的一个DTAB节点，表示此螺栓的标准长度。

Bitems：螺栓附件，用“NUT”代表螺母，“WASH”代表垫圈，如：NUT WASH WASH NUT    

Bitlength：Bitems中的附件所对应的长度，如：14  2  2  14

\subsection{TABWLD}

壁厚表的管理节点

\subsection{WTHTAB}

壁厚表节点，一个WTHTAB对应一个表号如：SCH20，主要用来配置壁厚（将在创建等级时讲解）。

\subsection{WTHELE}

表示壁厚表节点中的一项，一个WTHTAB壁厚表节点中通常有多个WTHELE节点。一个WTHELE节点对应某个表号下面的一个直径。

主要属性：

Bore：存储直径。

WThickness：存储壁厚。

\subsection{元件库的实例说明}
下面这个表\ref{GB12459tee}显示了GB12459的一种等径三通系列数据，新建元件库的时候，用形集描述它的几何外部形状，用点集标注关键连接点，用连接匹配表确定端面连接类型，用TEXT描述三通的直径等
软件中的元件库实例。
\begin{figure}
	\epsfig{file=paragontee.jpg,width=12cm}
	\caption{GB12459的一种等径三通系列数据\label{GB12459tee}}
\end{figure}

\begin{figure}
	\epsfig{file=paragonteegme.jpg,width=12cm}
	\caption{三通元件描述\label{paragonteegme}}
\end{figure}

图\ref{paragonteegme}左边是导航栏显示的节点，右边显示了软件中的三通的几何外形和点集描述。
可以看到，箭头指向的是形集，两个圆柱组成，圆圈圈向的是点集描述的元件连接点的位置，TEXT描述的元件的基本参数包括直径、外径、连接类型等，导航栏的节点与图形是一一对应的。

元件库每层基本都有如下属性

Name：结点名 

Type：结点类型（如：CATA、SECT、CATE、SCOM等）  

Lock：修改状态（True为可修改，False为不可修改）       

Owner：层次关系，它指向父结点。      

Description：该结点信息描述。 

\subsection{元件编码系统（Coding system）}

PDMS 要求数据库中的每一个元素有一个唯一的名字，即数据库中不能有重名的

元素。所以PDMS 采用了编码系统保证一个元素有一个唯一的名字,在使用过程

中经常要用到，例如：

1. 元件库中的元件命名。

2. 描述文字名称。

3. 点集名，型集名。

4. 连接形式名称。

以上的命名我们一般遵循PDMS 的编码系统。

5. 等级名。

6. 设备，框架名称。

5 和6 我们通常根据项目和设计要求来命名，一般不会有重名的情况。

采用编码系统的优点在于：

1. 通过有意义的命名为设计带来很大的方便。

2. 通过命名可以很容易在PDMS 层次结构中定位，查找元件。

3. 避免重名。

\subsection{标准编码系统（Standard Coding system）}

PDMS 提供了ANSI 元件库，包含50,000 个元件，同时建立了一套完整的编码
系统\ref{paragoncodesystem}允许用户用唯一的名字定义需要的元件。实际上，它可以生成超过6 千万个
不同的名字。

\begin{figure}
	\epsfig{file=paragoncodesystem.jpg,width=12cm}
	\caption{三通元件描述\label{paragoncodesystem}}
\end{figure}

\subsection{通用标准}
 
元件名称的每个字符都可从相关表格中选取。字符3 定义了元件类型，字符1可从国际标准栏中选取。 

所有其它字符都可从元件代码表及参考表中选取。 

例如：

元件	命名	描述	材料	标准

PIPE 无缝钢管 20\#	

ELBOW CAEA200 无缝弯头R=1.5DN 20\# 

VALVE	CCVGBQ0	闸阀41H-25	20\#	

FLANGE		光面法兰PN2.5	20\#	

GASKET	CAGCBQC	缠绕式垫片PN2.5		

BOLT	CSBQ	双头螺栓	25\#、35\#	

NOZZLE	CAZFBQ0	光面管嘴PN2.5		


\section{等级库}
等级库通过提取元件的特征信息，比如类型、管径等，通过这些特征信息将元件分类组织起来。等级库通过对其它不同数据库的信息的引用，将不同数据库中的信息集中起来。等级库的作用一是方便了元件的选取，二是方便了数据的访问。

\subsection{SPWL}

等级的管理节点，推荐同一个工程中所用的等级应该放在同一个SPWL节点下。

\subsection{SPEC}

一个等级对应一个SPEC节点。

\subsection{SELE}

用来将元件按照直径等属性进行分类，一个SPEC下可能会有多层SELE节点。

\subsection{SPCO}

引用了一个具体的元件（SCOM）。



\section{属性库}
属性库主要用来记录和管道有关的属性，包括元件管道中流动的介质：流体材料，以及管道外面用来保温的保温材料，最后还有管道的壁厚、腐蚀系数、应力加强系数等。

切换到属性库：

菜单：模块->属性模块

命令：ShowPropcon

\subsection{CMPW}

用来保存有关元件的应力分析有关参数的管理节点。

\subsection{CMPT}

将管道中的元件属性进行分类用的节点，比如分为管子属性和管件属性。

\subsection{TUBD}

保存在应力分析和创建等级中可能会用到的管子属性。它的主要属性有：壁厚、应力加强系数。如果TUBD节点设置了壁厚值，则可以用此节点设置管子等级的壁厚。

\subsection{CMPD}

保存在应力分析和创建等级中可能会用到的元件属性。它的主要属性有：壁厚、应力加强系数。如果CMPD节点设置了壁厚值，则可以用此节点设置元件等级的壁厚。

\subsection{MATW}

在WORL节点下用来保存材料的节点。

\subsection{SOLI}

用来保存固体材料的管理节点，保温材料放到此节点下。

\subsection{FLUI}

用来保存流体材料的管理节点。

\subsection{TEXT}

用来记录材料名称的节点。

\subsection{TDEN}

材料特性的管理节点。

\subsection{SDEN}

用来保存具体的材料特性，SDEN代表密度。

\section{CAE库}

AutoPDMS增加了CAE库，用于实现CAD与CAE协同设计，即实现CAD建模与CAE分析一体化，不需要象传统的CAE软件需要多次建模，也不需要导出CAD模型到CAE分析，而是按快捷键或者直接鼠标右键弹出并点击菜单"CFD计算流体力学"或"CSD计算固体力学"或"CED计算电磁学"对CAD模型进行分析，分析的结果保存在域对象，可以保存到持久化设备或者放弃保存，分析数据可以使用数字、云图、动画等方式显示在CAD GUI。

AutoPDMS仿真分析的结果保存在CAE库。

AutoPDMS CAD域对象：几何模型
AutoPDMS CAE域对象：几何模型、mesh、element、node、boundary、step、load、initialconditions

\section{分析GUI}
AutoPDMS CAE功能以尽量简单和易于理解的方式呈现给用户。

在AutoPDMS导航栏，选择管道或分支，或者选择结构或框架，或者选择设备或支吊架，或者选择任何可以计算的物体或物质，按快捷键或者直接鼠标右键弹出并点击菜单"CFD计算流体力学"或"CSD计算固体力学"或"CED计算电磁学"对CAD模型进行分析。

(在AutoPDMS三维模型显示区，现在鼠标右键显示的菜单是ACAD菜单。如果有必要，以后也可以加入AutoPDMS CAE分析菜单，方便用户。)

也可以在AutoCAD命令行输入cae命令，调用求解器进行分析。

\subsection{分析GUI的设计 \label{analysisgui}}
选择某个分支，点击AutoPDMS CAE菜单“CAE”，程序进入如下流程：

记录该分支的cae工况jobid；

记录该分支的cae工况输入文件扩展名id:jobnameInpExtID，根据这个字段的值查找ExtName表字段id，得到对应的扩展名字段extname的字符串，这个字符串就是输入文件扩展名jobnameInpExt；

记录该分支的cae工况输出文件扩展名id:jobnameOutputExtID，根据这个字段的值查找ExtName表字段id，得到对应的扩展名字段extname的字符串，这个字符串就是输出文件扩展名jobnameOutputExt；

记录选择的分支id在表job的字段branchid，记录该分支的cae网格的起始节点号startnodeid和起始单元号startelementid；

转换同一个jobid下的第一个branchid为字符串，它就是分支的cae工况输入文件名前缀jobname。

输入文件名=jobname+"."+jobnameInpExt。这就避免了请求用户规定输入文件名，简化了GUI操作，减少了用户学习软件成本，提高了用户操作效率。

计算结果文件=jobname+"."+jobnameOutputExt。这是ccx程序的规定。

输入文件和计算结果文件保存在工程存放目录。这就避免了请求用户规定输入文件和输出文件的目录名，简化了GUI操作。

工况表job位于设计数据库，其数据结构建立由如下SQL语句：

CREATE TABLE job
(jobid long,
jobnameInpExtID short,
jobnameOutputExtID short,
LCASE\_NUM		long,
branchid long,
startnodeid long,
startelementid long,
boundaryid short,
IntialConditionsID long,
stepid long,
analysistype char(1),
cload long,
dload long,
);

工况表jobnameExt位于设计数据库，其数据结构建立由如下SQL语句：

CREATE TABLE ExtName
(id short,
extname char(3));

分析类型表analysistype位于设计数据库，其数据结构建立由如下SQL语句：

CREATE TABLE analysistype
(id short,
analysistypename char(50));

\subsubsection{nodeset 节点集}

\subsubsection{node 节点}

\subsubsection{elementset 单元集}

\subsubsection{element 单元}

\subsubsection{boundary 边界条件}

\subsubsection{initialconditions 初始条件}

\subsubsection{analysistype 分析类型}

\subsubsection{step 步骤}

\subsubsection{cload 集中力}

\subsubsection{dload 分布力}

\subsubsection{dsload 分布面应力}

\subsection{接口驱动程序}
AutoPDMS CAE与ccx或求解器之间，有多种方法接口。

\subsubsection{cae到求解器}
AutoPDMS CAE到ccx求解器之间，可以增加一个驱动程序，把AutoPDMS CAE域对象赋值给ccx求解器数据结构。

程序数据流为：AutoPDMS CAE域对象-AutoPDMS CAE域对象到ccx求解器数据结构驱动程序-ccx求解器数据结构驱动程序。

这个设计方案的优势是速度很快，避免了读写输入文件或输出文件的时间消耗。

\subsubsection{cae到ccx输入文件接口驱动程序}
AutoPDMS CAE到ccx输入文件之间，可以增加一个驱动程序，提取AutoPDMS CAE域对象数据，写到ccx输入文件。

程序数据流为：AutoPDMS CAE域对象-AutoPDMS CAE域对象到ccx输入文件接口驱动程序-ccx输入文件。

程序工作流程为：

提取AutoPDMS CAE域对象数据，写成ccx inp格式文件。

按照\ref{analysisgui}设计要求，写相关信息到job表，以便其它接口驱动程序使用。

\subsubsection{求解器到cae}
ccx求解器数据结构字段保存了计算结果，同时ccx程序也输出结果在.dat或.frd文件。

在ccx求解器数据结构到AutoPDMS CAE域对象之间，增加一个驱动程序，直接存储ccx求解器计算结果在AutoPDMS CAE域对象，因此求解器计算结果可以直接显示在表格或三维模型。

\subsubsection{求解器输出结果文件到cae}
在ccx求解器输出结果文件到AutoPDMS CAE域对象之间，增加一个接口驱动程序。

接口驱动程序读取ccx程序的输出结果.dat或.frd格式文件，提取结果数据，存储到AutoPDMS CAE域对象。求解器写完计算结果后，可以发送信号给接口驱动程序，请求它提取结果文件，因此这种接口方式也可以直接显示计算结果数据在表格或三维模型上。

\subsection{显示接口}
显示接口的数据流程可以分解为如下：
AutoPDMS CAE域对象-驱动程序1-显示域对象-显示驱动程序2-显示对象(各种表格、云图、动画)-应用系统驱动程序3-显示器图像-显示器驱动程序4-显示器-可见光驱动5-用户(眼睛)。

可以看到，AutoPDMS CAE与用户之间，要经过5个驱动程序转换，其中前2个是需要我们自己开发的，第3个是AutoCAD提供的，第4个是操作系统或设备厂家提供了，第5个由人体的化学机制驱动。

前2个驱动程序可以合成一个程序，但分成2个驱动程序，有利于代码功能分离，减少代码耦合，简化代码，易于维护。

\subsubsection{cae与用户使用表格接口}
AutoPDMS CAE与用户之间的第1种接口方法，是在AutoPDMS CAE域对象与用户之间，增加一个表格显示驱动程序，显示计算结果在表格。

可以使用gtk sheet控件开发表格，gtk的优点是可以安装在多种平台。也可以使用mfc开发表格，AutoPDMS有可用的现成的输出表格函数库(包括mfc格式、dwg格式、excel格式、mdb格式、txt格式)。可以使用表格模板配置用户化表格。excel表格模板例题在\ref{excelsheet}。输出表格的源代码目录在\ref{tablesrc}。

可供cfd使用的一种表格数据结构如下：
字段标题		字段名		字段类型	含义	
时间			Time		int			时间
工况			LCASE\_NUM		int		工况
节点编号	  nodenumber	long		节点编号
流量			field001	float		流量
压力			field002	float		压力
温度			field011	float		温度

可供psa使用的一种表格数据结构如下，它与caesarii输出数据库数据结构一致，如图\ref{caesariimdb}。
为了让它保存动态数据，应该加入时间字段，如下：
字段标题		字段名		字段类型	含义	
时间			Time		int			时间
工况			LCASE\_NUM		int			工况
节点编号			nodenumber	long		节点编号
力			FX	float		FX
力			FY	float		FY
力			FZ	float		FZ
...

\begin{figure}
	\epsfig{file=caesariimdb.jpg,width=12cm}
	\caption{caesarii使用的access格式输出数据结构\label{caesariimdb}}
\end{figure}

几种管网水力计算表格式如下：

\begin{figure}
	\epsfig{file=heatingnetcfd.jpg,width=12cm}
	\caption{采暖水力平衡计算表\label{heatingnetcfd}}
\end{figure}

\begin{figure}
	\epsfig{file=sewageconduitnet.jpg,width=12cm}
	\caption{污水管网水力计算表\label{sewageconduitnet}}
\end{figure}

\begin{figure}
	\epsfig{file=pipenetsolver.jpg,width=12cm}
	\caption{某市供水管网平差计算书：节点参数\label{pipenetsolver}}
\end{figure}

\begin{figure}
	\epsfig{file=pipenetsolverelement.jpg,width=12cm}
	\caption{某市供水管网平差计算书：管道参数\label{pipenetsolverelement}}
\end{figure}

\subsubsection{cae与用户使用云图接口}
AutoPDMS CAE与用户之间的第2种接口方法，是在AutoPDMS CAE域对象与用户之间，增加一个云图显示驱动程序，显示计算结果在云图。
云图也称为颜色图，它使用不同的颜色表示数值大小，因而可以直观显示场变量的变化。
cgx程序有c代码读取.frd文件数据，使用opengl显示颜色图，可供参考。
AutoPDMS 图形显示源代码目录参见\ref{graphicdisplay}。
AutoPDMS 实现云图应该调用ObjectARX AcGi类库，并需要实现用户自定义实体。\ref{caedomaindisplay}
ObjectARX AcGi类库提供了实体的绘制接口。这个类库主要被AcDbEntity的成员函数wordDraw、viewportDraw和saveAs调用，是所有实体标准协议的一部分。wordDraw是所有用户实体类必须定义的函数。AcGiWorldDraw对象提供了应用程序接口供worldDraw函数调用来绘制实体，使得实体在各个视角图下面能够显示出来。同样的AcGiViewPortDraw对象提供了一些接口来供ViewPortDraw函数调用来在各个视角下有不同的显示。

\subsubsection{cae与用户使用动画接口}
AutoPDMS CAE与用户之间的第3种接口方法，是在AutoPDMS CAE域对象与用户之间，增加一个动画显示驱动程序，显示计算结果在动画。

\section{设计库}

AutoPDMS设计元素存储在设计数据库。设计数据库用于三维设计模块。

三维设计模块包括配管、结构、设备、电缆托架、HVAC、支吊架等模块，它与DRAFT-平竖面图生成、ADMINISTRATION-项目用户管理、ISODRAFT-轴测图生成、PARAGON-构造元件库、SPECON-构建等级库、PROPCON-构建属性库等共同协作完成设计任务。

AutoPDMS数据库层次(Database hierarchy)是一种层次和树状结构的数据库，参见图\ref{designelements}。

\begin{figure}
	\epsfig{file=designelements.jpg,width=12cm}
	\caption{PDMS设计数据库层次\label{designelements}}
\end{figure}

WORLD—建立数据库时，自动生成一个 WORLD。

在导航器中只能看到一个 WORLD。 

SITE—可以是整个工厂，也可以是一个单元，一个项目。在一个 PDMS项目中可以有多个 SITE。 

ZONE—它不是一个物理分区，而是同类元件的集合，可以当作一个逻辑组。例如 PIPE ZONE，EQUIPMENT ZONE，STRUCTURES ZONE。 

EQUIPMENT，STRUCTURES，PIPES—指定了类型和名字，这一级下面才是你在图 形屏幕中能实际看到的实体。 

PRIMITIVE—组成模型的基本体，包括 box，cylinder，dish等。 

数据库基本概念 

Elements-数据库中的每一个项目叫做一个元素,每一个元素都有属性保存它的详细信息，不同类型的元素属性也不同。 

CE=current element表示当前元素，当前元素可以是一个元素，也可以是元素的集合。 

Types-数据库中的每一个元素都有一个 Type属性，Type相同的元素都有相同的属性。 

Owner/Members从属关系。 


\newpage
\part{应用层}

\subsection{配管}

\subsection{管道应力分析}
AutoPSA是一个与CAESARII很相似的管道应力分析软件，其输入格式.psa兼容.cii格式，输出格式兼容caesarii格式，输出的结果数据库access表数据结构与caesarii相同。

\subsection{管道应力分析输出数据库结构\label{psamdbstruct}}

启动AutoPSA，打开H:/ Program Files (x86)/ 长沙优易软件开发有限公司/ AutoPSA9.3/ PSA/ Example.in文件，从AutoPSA主菜单中选择“应力分析”->“静力分析-兼容CAESARII(C)”菜单，打开静态载荷工况编辑器。

点击“推荐工况”，将打开“推荐工况、荷载组合”对话框(如下图)。其中列出了满足设计要求的载荷工况。选择“使用推荐工况”，点击图标“进行计算”。

从AutoPSA主菜单中选择“工具”->“输出计算结果到ACCESS数据库”，在文件对话框选择“保存”。

使用access打开H:/ Program Files (x86)/ 长沙优易软件开发有限公司/ AutoPSA9.3/ PSA/ Example.mdb，可以看到一些表格，名称前缀为OUTPUT的表格存放了输出结果数据。可以使用这些表格存储管道应力分析ccx\_psa的计算结果数据，也可以使用类似表格存储结构分析ccx\_ssa的计算结果数据。给这些表格加入时间字段t，以及温度Temp、压力Pressure字段，即可存储动力学计算结果数据。

同样，类似地，可以设计cfd表格。

以上只是笔者设想的重构方案之一。

还有一种方案是在工程数据库中加表格，或者利用原来的表格。还需要仔细分析。现在先搞清楚其结构。

\subsection{管网流体分析}

\subsection{支吊架}

\subsection{HVAC}

\subsection{设备}

\subsubsection{容器}

\subsubsection{换热器}

\subsubsection{泵}

\subsubsection{风机}

\subsubsection{电机}

\subsubsection{内燃机}

\subsubsection{蒸汽轮机}

\subsubsection{燃气轮机}

\subsubsection{变压器}

\subsection{电缆托架}

\subsection{结构}

\subsubsection{民用建筑结构}

\subsubsection{商业建筑结构}

\subsection{工业建筑结构}

\subsubsection{火力发电厂}

\subsubsection{水力发电厂}

\subsubsection{风力发电厂}

\subsubsection{光伏发电厂}

\subsubsection{光热发电厂}

\subsubsection{核能发电厂}

\subsubsection{水泵站}

\subsubsection{变电站}

\subsection{特种结构}

\subsection{船舶结构}

\subsection{结构分析}

\subsection{建筑}

\subsection{民用建筑}

\subsubsection{中层民用建筑}

\subsubsection{高层民用建筑}

\subsubsection{别墅}

\subsection{工业建筑}

\subsection{电气}

\subsection{电网}

\subsubsection{输电线路}

\subsubsection{铁塔}

\subsubsection{杆塔}

\subsection{电气设备}

\subsection{电子}

\subsubsection{网络}

\subsubsection{电路板}

\subsubsection{通信线路}

\subsubsection{芯片}

\newpage
\include{AutoPDMSversionhistory}
\include{computinghistory}

\section*{长沙优易软件开发有限公司发展史 } \label{uesofthistory}
\addcontentsline{toc}{section}{长沙优易软件开发有限公司发展史}
2000年6月25日，国务院全文发表2000年18号文件《鼓励软件产业和集成电路产业发展的若干政策》。“为推动我国软件产业和集成电路产业的发展，增强信息产业创新能力和国际竞争力，带动传统产业改造和产品升级换代，进一步促进国民经济持续、快速、健康发展，制定以下政策。

第一章　　政策目标 

第一条　　通过政策引导，鼓励资金、人才等资源投向软件产业和集成电路产业，进一步促进我国信息产业快速发展，力争到2010年使我国软件产业研究开发和生产能力达到或接近国际先进水平。”

第三章税收政策给出了多项重大税收优惠，如第五条对增值税超过3\%的部分即征即退，非常激动人心。李国斌再也坐不住了。

2000年9月30日，李国斌离开了工作12年的湖南省电力勘测设计院，创办软件公司。

2000年10月23日，长沙优易软件开发有限公司经长沙市工商行政管理局核准登记设立。

刚开始，李国斌开发了一个管道支吊架设计软件AutoPHS。

2001年6月8日湖南省电力勘测设计院主持召开管道支吊架设计软件AutoPHS2000V1.26鉴定会。徐志生总工主持鉴定会，刘志斌院长、许友元副总工、傅靖茜主任等参加了会议，参加鉴定会的还有：陈桂松、张吉栋、林其略、田福安、王小艳、周晟、孙斌等。

2001年，购买了一个管道应力分析软件的源代码，招聘中南大学信息与计算科学2002届本科毕业生吴志林(考入中科院软件所研究生硕博连读)将其Fortran代码改为C++代码，安排许朝使用C++和OpenGL写了图形界面，2002年12月20日管道应力分析软件AutoPSA1.0在北京中国石化建设工程公司通过鉴定。鉴定委员会成员：王聪生、李智、刘洪杰、唐永进、林炳荣、杨荣坚。

2003年，购买了一个管道设计软件pipe的源代码，修改AutoLISP代码为C++代码，命名软件为AutoPD，2004年4月AutoPD2.0在湖北省电力勘测设计院通过鉴定。鉴定委员会成员：夏敏文、汪泓毅、屠建华、胡玉清、李晋鹏、向陆伟。

2005年5月8日，与张书俊、吴志桥博士签订AutoPSA开发合同，解决算法问题。

2006年1月1日-2007年4月，与张书俊博士签订AutoPSA开发合同，继续解决算法问题。

2006年6月，开始启动AutoPDMS软件项目。它的目标是企图实现一个在AutoCAD上运行的PDMS。

2010.04.29长沙优易软件开发有限公司(UESOFT)今天宣布公开AutoPDMS最新版全部源代码，为二次开发者提供方便。

长沙优易软件开发有限公司(UESOFT)开发的新一代三维工厂协同设计管理系统AutoPDMS为工厂设计人员提供了统一的CAD设计环境。AutoPDMS操作方式与AVEVA PDMS相似，集成了设计库(Piping、Equipment、HVAC、H\&S、Steel)、元件库和等级库(Paragon \& Specon)、轴测图(即管段图、空视图)Isodraft、投影图(平断面图)DRAFT、应力分析接口、流体分析接口、模型转换(导出PDMS模型到AutoPDMS)、权限管理Admin、多用户协同设计。该软件自2007年10月首次发布以来，截至今日被下载32649次。

为了便于二次开发，UESOFT在公司网站提供AutoPDMS全部源代码，并提供了一个简要指南描述了使用AutoPDMS全部源代码进行二次开发的步骤。开发者下载后遇到问题还可以得到UESOFT技术人员的帮助。


\begin{thebibliography}{99}
	
	\bibitem{Zienkiewicz} Zienkiewicz, O.C. and Taylor, R.L., \textit{The finite element method}.McGraw-Hill Book Company (1989).
	
	\bibitem{Zienkiewicz2} Zienkiewicz, O.C., Taylor, R.L. and Nithiarasu, P.,
	\textit{The finite element method for fluid dynamics}. 6th edition, Elsevier (2006).

	\bibitem{Hughes} Hughes, T.J.R., \textit{The Finite Element Method}. Dover Publications Inc., Mineola, New York (2000).
	
	\bibitem{Dhondt} Dhondt, G., \textit{The Finite Element Method for 		Three-Dimensional Thermomechanical Applications}. John Wiley \& Sons, (2004).
	
	\bibitem{mordernos} 陈, 向群等译, Tanenbaum, \textit{现代操作系统}. 机械工业出版社 , (2009).
	
	\bibitem{yangkzh} 杨, 开振, \textit{深入浅出MyBatis技术原理与实战}. 电子工业出版社 , (2016).

	\bibitem{chnpdms115} 王元,\textit{AVEVA PDMS基础 }. \htmlref {/ / Systemuk/ d/ PDMS中文教程11.5}. AVEVA中国, (2004).	
	
	\bibitem{chnpdms} 张伟群,\textit{AVEVA PDMS培训手册 }. \htmlref {/ / Systemuk/ d/ PDMS中文教程新版}. AVEVA中国, (2003).
	
	\bibitem{apdevdoc} uesoft,uksoft,  \textit{AutoPDMS9.0开发文档}. \htmlref {/ / Systemuk/ e/ VC/ AutoPDMS9.0-Document/ 开发文档}. UESOFT, 湖南,长沙,(2017).
	
	\bibitem{apdoc} uesoft,uksoft,  \textit{AutoPDMS10.4帮助文档}. \htmlref {H:/ Program Files (x86)/ 长沙优易软件开发有限公司/ AutoPDMS10.4.4/ Help/ AutoPDMS10.4帮助文档.doc}. UESOFT, 湖南,长沙,(2018).

	\bibitem{psadoc} uesoft,udsoft,  \textit{AutoPSA用户指南}. \htmlref {H:/ Program Files (x86)/ 长沙优易软件开发有限公司/ AutoPSA9.3/ Help/ AutoPSA用户指南.doc}. UESOFT, 湖南,长沙,(2018).
	

\end{thebibliography}

%\end{multicols}


\end{document}
